Laravel находит запись в другой таблице, связанной с $data

#laravel #view #controller

#laravel #Вид #контроллер

Вопрос:

Я просматриваю некоторый код laravel, и у меня есть несколько вопросов относительно кода. В представлении я вижу фрагмент кода «$data-> profile-> age». Находит ли этот код запись профиля автоматически в таблице профилей, связанной с $data? Как он находит связанный профиль?

Контроллер:

 return view('new-design.pages.influencer.info')
                ->withData($data)
  

Вид:

 $data->profile->age
  

Ответ №1:

ДА. Он находит связанный профиль, используя отношения, которые вы определили в своей модели профиля

Как только связь определена, мы можем извлечь связанную запись, используя динамические свойства Eloquent. Динамические свойства позволяют получить доступ к методам взаимосвязи, как если бы они были свойствами, определенными в модели:

Вот простой пример из документации, который поможет вам понять:

Допустим, у вас есть posts таблица и comments table:

Нам нужно определить взаимосвязь между этими двумя таблицами.

Отношение «один ко многим» используется для определения отношений, при которых одной модели принадлежит любое количество других моделей. Например, сообщение в блоге может содержать бесконечное количество комментариев.

Примечание: в вашей comments таблице должен быть внешний ключ, ссылающийся на posts таблицу, например post_id , в этом случае, если вы используете другое имя, вы должны сообщить об этом в своем отношении:

Помните, Eloquent автоматически определит соответствующий столбец внешнего ключа в модели комментария. По соглашению, Eloquent возьмет «змеиный регистр» имени модели-владельца и добавит к нему суффикс with _id . Итак, для этого примера Eloquent предположит, что внешний ключ в модели комментариев является post_id .

В вашей модели Post вы могли бы сделать:

 <?php

namespace App;

use IlluminateDatabaseEloquentModel;

class Post extends Model
{
    /**
     * Get the comments for the blog post.
     */
    public function comments()
    {
        return $this->hasMany('AppComment');
    }
}


  

И в вашей модели комментариев вы должны определить обратную зависимость

 <?php

namespace App;

use IlluminateDatabaseEloquentModel;

class Comment extends Model
{
    /**
     * Get the post that owns the comment.
     */
    public function post()
    {
        return $this->belongsTo('AppPost');
    }
}

  

Теперь, если вы хотите получить доступ ко всем комментариям из сообщения, вам просто нужно получить отношение:

 $post = Post::find($id); // find a post
$post->comments; // This will return all comments that belong to the given post

  

Таким образом, вы в основном получаете к ним доступ, как если бы они были свойством модели, как сказано в документации

На ваш взгляд, вы могли бы сделать что-то вроде этого:

 @foreach($post->comments as $comment)
{
 {{$comment->text}} 
}
@endforeach
  

В этом примере будет напечатан каждый текст комментария из записи, которую мы получаем в контроллере.

Ответ №2:

Я считаю, что в вашей модели для $ data есть функция, называемая profile. Из этого он получает эквивалентный профиль.

Пример: Представьте, что у вас есть модель под названием phone, и вы хотите найти пользователя, которому она принадлежит. Вы можете написать следующую функцию в вашей модели.

     public function user()
    {
        return $this->belongsTo('AppUser');
    }
  

И в представлении вы можете написать что-то вроде

 $phone->user->name
  

Теперь за кулисами laravel перейдет к телефону и получит значение из user_id для этого телефона. (Если внешний ключ расположен в другом столбце, вы также можете указать это). Затем laravel найдет таблицу users с этим user_id и извлекет строку. Затем отобразите имя в представлении.

Теперь, если есть сложный запрос, вы также можете написать функцию для этого в модели.