急于加载返回 ID 而不是模型
Eager loading returning ID instead of model
我在使用以下代码进行预加载时遇到问题。
问题出在 Status 模型上
$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');
}
}
将代码更改为
$ticket->status()->get();
这将 return 对象。
$ticket->status;
这个只会 return 原始 ID。
根据您的关系定义,您的 Ticket
模型似乎有一个名为 status
的字段。如果您的模型上有一个字段名称与您的关系方法之一同名,那么当您执行 $ticket->status
时,您将获得字段的值,而不是相关对象。
因此,根据我所见,您的 tickets.status
字段似乎是 statuses
table 的外键。如果是这种情况,则存在一些问题。
首先,您的 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
访问 id 字段,并使用 $ticket->status
.
访问相关的 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');
}
这样,您可以使用 $ticket->status
访问 id 字段,并使用 $ticket->relatedStatus
.
访问相关的状态对象
我在使用以下代码进行预加载时遇到问题。
问题出在 Status 模型上
$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');
}
}
将代码更改为
$ticket->status()->get();
这将 return 对象。
$ticket->status;
这个只会 return 原始 ID。
根据您的关系定义,您的 Ticket
模型似乎有一个名为 status
的字段。如果您的模型上有一个字段名称与您的关系方法之一同名,那么当您执行 $ticket->status
时,您将获得字段的值,而不是相关对象。
因此,根据我所见,您的 tickets.status
字段似乎是 statuses
table 的外键。如果是这种情况,则存在一些问题。
首先,您的 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
访问 id 字段,并使用 $ticket->status
.
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');
}
这样,您可以使用 $ticket->status
访问 id 字段,并使用 $ticket->relatedStatus
.