2016-02-13 56 views
0

我有一个使用下面的代码进行加载的问题。急于加载返回的ID而不是型号

问题是与状态模型

$ticket = Ticket::where('id', $id)->with(['customer', 'status', 'notes' => function($query) { 
    $query->orderBy('updated_at', 'desc'); 
}])->first(); 

如果我这样做,

return response()->json($ticket); 

我得到预期的回应,一切OK

{"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'); 
    } 
} 
+1

尝试:$ ticket-> status() - > get(); –

+1

你试过这个吗? –

+0

哦,这很有效,谢谢。 任何想法,为什么我必须这样做? – BrendanDodd

回答

1

根据你的关系定义,它看起来像你的Ticket模型有一个字段名为status。如果模型中的字段名称与您的某个关系方法的名称相同,则在执行$ticket->status时,您将获取字段的值,而不是相关对象。

所以,根据我所看到的,它看起来像你的tickets.status字段是statuses表的外键。如果是这种情况,那么有几个问题。

首先,您的status字段应更名为status_id。这将有助于消除字段名称和相关对象之间的不明确性。

其次,由于您的票证模型包含外键,它位于关系的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'); 
} 

有了这个,你访问id字段为$ticket->status,相关状态对象为$ticket->relatedStatus

1

更改您的代码

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

这会返回对象。

$ticket->status; 

这一个只会返回原始ID。

+0

这是因为我的列名与模型相同吗?状态? – BrendanDodd

+0

不,您默认调用的只是模型ID。为了将模型对象作为一个集合,您可以在关系上调用get函数。 –

+0

如果我打电话给$ ticket-> customer,它是如何工作的,那么我会得到Model? – BrendanDodd