Laravel Eloquent: как автоматически получать отношения при сериализации через toArray/toJson

Я полагаю, что это работает для автоматической выборки user и replies, когда я сериализую свой объект на JSON, но действительно ли toArray правильный способ сделать это?

<?php

class Post extends Eloquent
{
    protected $table = 'posts';
    protected $fillable = array('parent_post_id', 'user_id', 'subject', 'body');

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

    public function replies()
    {
        return $this->hasMany('Post', 'parent_post_id', 'id');
    }

    public function toArray()
    {
        $this->load('user', 'replies');
        return parent::toArray();
    }
}

Ответы

Ответ 1

Вместо переопределения toArray() для загрузки пользователя и ответов используйте $with.

Вот пример:

<?php

class Post extends Eloquent
{
    protected $table = 'posts';
    protected $fillable = array('parent_post_id', 'user_id', 'subject', 'body');

    protected $with = array('user', 'replies');


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

    public function replies()
    {
        return $this->hasMany('Post', 'parent_post_id', 'id');
    }

}

Кроме того, вы должны использовать toArray() в своих контроллерах, а не в своих моделях, например:

Post::find($id)->toArray();

Надеюсь, это поможет!

Ответ 2

Я должен представить новый ответ, так как я ТАК. Более подходящий способ выполнить это для тех, кто находит это в Google, как я сделал, - это избегать использования protected $with, если вам не нужно и вместо этого переместите этот вызов with() в ваш поиск.

<?php

class Post extends Eloquent
{
    protected $table = 'posts';
    protected $fillable = array('parent_post_id', 'user_id', 'subject', 'body');


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

    public function replies()
    {
        return $this->hasMany('Post', 'parent_post_id', 'id');
    }

}

И затем вы можете изменить почтовый вызов для предварительной загрузки по мере необходимости:

Post::with('user','replies')->find($id)->toArray();

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