Laravel полиморфные вложенные отношения, показывающие необъяснимое поведение

Я использую полиморфные отношения для обработки отчетов как рецептов, так и комментариев. У меня нет проблем с включением полиморфного объекта в мои запросы, но проблема возникает, когда я хочу также указать владельца (пользователя) указанного полиморфного объекта.

Сначала я попытался сделать следующее:

Попытка 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');
}
}

2

Решение

Мы получили очень простое решение — всегда возвращать пользователя с желаемыми моделями, используя:

protected $with = array('user');

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

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

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]