Php 急于加载返回的ID而不是模型
我有一个问题,急于加载使用下面的代码 问题在于状态模型Php 急于加载返回的ID而不是模型,php,laravel,eloquent,eager-loading,eager,Php,Laravel,Eloquent,Eager Loading,Eager,我有一个问题,急于加载使用下面的代码 问题在于状态模型 $ticket = Ticket::where('id', $id)->with(['customer', 'status', 'notes' => function($query) { $query->orderBy('updated_at', 'desc'); }])->first(); 如果我这样做 return response()->json($ticket); 我得到了预期的回应,好吗
$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');
}
}
机票型号:
class Status extends Model
{
protected $table = 'statuses';
}
class Ticket extends Model
{
public function status() {
return $this->hasOne('App\Status', 'id', 'status');
}
}
将代码更改为
$ticket->status()->get();
这将返回对象
$ticket->status;
这只会返回原始id。将代码更改为
$ticket->status()->get();
这将返回对象
$ticket->status;
这个将只返回原始id。根据您的关系定义,您的
票证
模型似乎有一个名为状态
的字段。如果模型上的字段名与某个关系方法的名称相同,则在执行$ticket->status
操作时,将获取字段的值,而不是相关对象的值
因此,根据我所看到的,它看起来像是您的票据。status
字段是status
表的外键。如果是这样,那么就有几个问题
首先,您的status
字段应重命名为status\u id
。这将有助于消除字段名和相关对象之间的歧义
其次,由于您的票证模型包含外键,因此它位于关系的belongsTo
一侧。这听起来可能有点奇怪,但是状态
可以有许多票据
,但是票据
属于状态
。因此,您需要将您的status()
关系从hasOne
更改为belongsTo
如果将status
字段重命名为status\u id
,则可以将方法更改为:
public function status() {
return $this->belongsTo('App\Status');
}
这样,您就可以使用$ticket->status\u id
访问id字段,并使用$ticket->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
访问相关状态对象。根据您的关系定义,您的ticket
模型似乎有一个名为status
的字段。如果模型上的字段名与某个关系方法的名称相同,则在执行$ticket->status
操作时,将获取字段的值,而不是相关对象的值
因此,根据我所看到的,它看起来像是您的票据。status
字段是status
表的外键。如果是这样,那么就有几个问题
首先,您的status
字段应重命名为status\u id
。这将有助于消除字段名和相关对象之间的歧义
其次,由于您的票证模型包含外键,因此它位于关系的belongsTo
一侧。这听起来可能有点奇怪,但是状态
可以有许多票据
,但是票据
属于状态
。因此,您需要将您的status()
关系从hasOne
更改为belongsTo
如果将status
字段重命名为status\u id
,则可以将方法更改为:
public function status() {
return $this->belongsTo('App\Status');
}
这样,您就可以使用$ticket->status\u id
访问id字段,并使用$ticket->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
Try:$ticket->status()->get()访问相关的状态对象;哦,行得通,谢谢。知道我为什么要这样做吗?试试:$ticket->status()->get();哦,行得通,谢谢。知道我为什么要这样做吗?这是因为我的列名与模型相同吗?状态?不,您所调用的只是默认的模型id。为了将模型对象作为集合获取,您对关系调用了get函数。如果我调用$ticket->customer,它怎么会起作用呢?如果ticket
模型有一个名为status
的字段,那么@jilsontomas$ticket->status
只会返回原始id,除了名为status()
的关系之外,这是因为我的列名与模型相同吗?状态?不,您所调用的只是默认的模型id。为了将模型对象作为集合获取,您对关系调用了get函数。如果我调用$ticket->customer,它怎么会起作用呢?如果ticket
模型有一个名为status
的字段,那么@jilsontomas$ticket->status
只会返回原始id,除了名为status()
的关系之外。