#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
и извлекет строку. Затем отобразите имя в представлении.
Теперь, если есть сложный запрос, вы также можете написать функцию для этого в модели.