Laravel найти запись в другой таблице, связанной с $ data - PullRequest
0 голосов
/ 08 марта 2019

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

Контроллер:

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

Вид:

$data->profile->age

Ответы [ 2 ]

1 голос
/ 08 марта 2019

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

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

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

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

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

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

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

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

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

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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


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

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

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

$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

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

1 голос
/ 08 марта 2019

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

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

    public function user()
    {
        return $this->belongsTo('App\User');
    }

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

$phone->user->name

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

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

...