Идет загрузка, возвращая идентификатор вместо модели

У меня проблема с 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');
}
}

0

Решение

Согласно вашему определению отношений, это выглядит как ваш 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,

1

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

Измените свой код на

$ticket->status()->get();

Это вернет объект.

 $ticket->status;

Этот вернет только необработанный идентификатор.

1

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