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();
Таким образом, вы не будете включать ненужные данные каждый раз, когда вы берете запись, если она вам не нужна.