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);

我得到状态的 id,而不是模型

1

状态模型:

class Status extends Model
{
    protected $table = 'statuses';
}

票种型号:

class Ticket extends Model
{
    public function status() {
        return $this->hasOne('App\Status', 'id', 'status');
    }
}
4

2 回答 2

2

根据您的关系定义,您的模型看起来Ticket有一个名为 的字段status。如果您的模型上有一个与您的关系方法之一同名的字段名称,那么当您这样做时$ticket->status,您将获得字段的值,而不是相关对象。

因此,根据我所看到的,您的tickets.status字段似乎是表的外键statuses。如果是这种情况,则存在一些问题。

首先,您的status字段应重命名为status_id. 这将有助于消除字段名称和相关对象之间的歧义。

其次,由于您的 Ticket 模型包含外键,因此它位于belongsTo关系的一边。听起来可能有点奇怪,但是 aStatus可以有很多Tickets,但 aTicket属于 a Status。因此,您需要将您的status()关系从更改hasOnebelongsTo

如果将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

于 2016-02-13T06:02:58.763 回答
1

将您的代码更改为

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

这将返回对象。

 $ticket->status;

这个只会返回原始ID。

于 2016-02-13T02:18:14.703 回答