2016-02-13 3 views
0

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

Попробуйте: $ ticket-> status() -> get(); –

+1

Вы попробовали это? –

+0

О, это работает, спасибо. Любая идея, почему я должен так поступать? – BrendanDodd

ответ

1

Согласно вашему определению отношения, похоже, что у вашей модели 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'); 
} 

С этим, вы получаете доступ к полю идентификатора с $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; 

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

+0

Это потому, что у меня есть имя столбца, такое же, как у модели? положение дел? – BrendanDodd

+0

Нет, то, что вы назвали, по умолчанию является идентификатором модели. Чтобы получить объект модели как коллекцию, вы вызываете функцию get в отношении. –

+0

Как это работает, если я позвоню $ ticket-> клиенту, тогда я получу модель? – BrendanDodd

Смежные вопросы