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()
的关系之外。