У меня проблема с Eager Loading с использованием приведенного ниже кода.
Проблема с моделью состояния
$ticket = Ticket::where('id', $id)->with(['customer', 'status', 'notes' => function($query) {
$query->orderBy('updated_at', 'desc');
}])->first();
Если я сделаю,
return response()->json($ticket);
Я получаю ожидаемый ответ, все в порядке
{"id":1,"customer_id":10001,"ztk_ticket_no":"ZTK0000001","status":{"id":1,"value":"Open","deleted_at":null,"created_at":"2016-02-13 01:36:20","updated_at":"2016-02-13 01:36:20"},"deleted_at":null,"created_at":"2016-02-13 01:36:20","updated_at":"2016-02-13 01:36:20","customer":{"id":1,"customer_id":10001,"title":"Test Company","deleted_at":null,"created_at":"2016-02-13 01:36:20","updated_at":"2016-02-13 01:36:20"},"notes":[{"id":1,"ticket_id":1,"note":"Lorem ipsum dolor sit amet, ","status":1,"deleted_at":null,"created_at":"2016-02-13 01:36:20","updated_at":"2016-02-13 01:36:20"}]}
Но если я сделаю
return response()->json($ticket->status);
Я получаю идентификатор статуса, а не модель
1
Модель состояния:
class Status extends Model
{
protected $table = 'statuses';
}
Модель билета:
class Ticket extends Model
{
public function status() {
return $this->hasOne('App\Status', 'id', 'status');
}
}
Согласно вашему определению отношений, это выглядит как ваш Ticket
модель имеет поле с именем status
, Если у вас есть имя поля в вашей модели с тем же именем, что и у одного из ваших методов отношений, при $ticket->status
, вы собираетесь получить значение поля, а не связанный объект.
Итак, на основании того, что я вижу, похоже, что tickets.status
поле является внешним ключом к statuses
Таблица. Если это так, то есть несколько вопросов.
Во-первых, ваш status
поле должно быть переименовано в status_id
, Это поможет устранить неоднозначность между именем поля и связанным объектом.
Во-вторых, поскольку ваша модель Ticket содержит внешний ключ, она находится на belongsTo
сторона отношений. Это может звучать немного странно, но Status
может иметь много Tickets
, но Ticket
принадлежит к Status
, Итак, вам нужно изменить свой status()
отношения от hasOne
в belongsTo
,
Если вы переименуете status
поле для status_id
Вы можете изменить свой метод на это:
public function status() {
return $this->belongsTo('App\Status');
}
При этом вы получаете доступ к полю id с $ticket->status_id
и связанные Status
объект с $ticket->status
,
Если вы не можете изменить свой status
поле, то было бы неплохо переименовать ваш status()
метод отношений, поэтому ваш метод должен выглядеть примерно так:
// relationship method renamed
public function relatedStatus() {
// second parameter required since foreign key does not conform to Laravel conventions
return $this->belongsTo('App\Status', 'status');
}
При этом вы получаете доступ к полю id с $ticket->status
и связанный объект состояния с $ticket->relatedStatus
,
Измените свой код на
$ticket->status()->get();
Это вернет объект.
$ticket->status;
Этот вернет только необработанный идентификатор.