Я использую полиморфные отношения для обработки отчетов как рецептов, так и комментариев. У меня нет проблем с включением полиморфного объекта в мои запросы, но проблема возникает, когда я хочу также указать владельца (пользователя) указанного полиморфного объекта.
Сначала я попытался сделать следующее:
Попытка 1. Функция контроллера:
public function getReports() {
return Report::orderBy('created_at', 'DESC')
->with('reportable', 'reportable.user')
->get();
}
Это не привело к ошибке, что хорошо, но это также не включить пользователя в результаты.
Смотрите данные: http://pastebin.com/DDfM3Ncj
Попытка 2. Добавлен код в полиморфный Модель отчета (видно внизу):
protected $appends = array('target');
public function getTargetAttribute() {
return $this->reportable->user;
}
Это правильно привело к тому, что в мои результаты была добавлена «цель», содержащая пользователя отчетного объекта. Однако это ТАКЖЕ загадочно добавил пользователя к моему отчетному объекту, что я и хотел сначала, но теперь проблема, так как у нас есть целевой пользователь.
Смотрите данные: http://pastebin.com/4DD8imbN
Как я могу получить от пользователя полиморфные отношения, не внезапно заканчивая двумя.
НОТА: (Ниже код возможно не требуется для ответа)
public function getReports(t) {
return Report::orderBy('created_at', 'DESC')
->with('reportable')
->get();
}
Полиморфная модель
class Report extends Model {
public function reportable() {
return $this->morphTo();
}
public function User() {
return $this->belongsTo('App\User');
}
}
Рецепт Модель
class Recipe extends Model {
public function user() {
return $this->belongsTo('App\User');
}
public function reports() {
return $this->morphMany('App\Report', 'reportable');
}
}
Модель комментария
class RecipeComment extends Model {
public function user() {
return $this->belongsTo('App\User');
}
public function reports() {
return $this->morphMany('App\Report', 'reportable');
}
}
Мы получили очень простое решение — всегда возвращать пользователя с желаемыми моделями, используя:
protected $with = array('user');
Это, очевидно, имеет недостаток в том, что теперь пользователь всегда охотно загружается при запросе любой из упомянутых моделей. Но мы считаем, что это приемлемая потеря, поскольку у нас есть только один запрос, в котором пользователь не требуется.
Недостаток делает использование кеша еще менее значительным, настолько, что мы значительно предпочитаем это решение, а не игнорируем «ошибку» возвращения двух пользователей.
Других решений пока нет …