laravel:如何在一对多关系中使用wherePivot

时间:2018-03-25 12:04:21

标签: php laravel

我有两对一对:
状态>订单
状态>门票

订单

id, status_id
1, 5

id, status_id
1, 2

状态

id, table,    language_id, key, name
 1, 'orders',  1,          1,   'Pending'
 2, 'orders',  1,          2,   'Processing'
 3, 'orders',  1,          3,   'Shipped'
 4, 'orders',  1,          4,   'Canceled'
 5, 'orders',  1,          5,   'Complete'
 6, 'tickets', 1,          1,   'unanswered'
 7, 'tickets', 1,          2,   'answered'
 8, 'tickets', 1,          3,   'closed'
//unique(['table', 'language_id', 'key'])

在订单模型中

public function status()
{
  //ok
  return $this->belongsTo('App\Models\Status', 'status_id', 'key')->where('table', 'orders')->where('language_id', 1);

  //not ok
  return $this->belongsTo('App\Models\Status', 'status_id', 'key')->wherePivot('table', '=', 'orders')->wherePivot('language_id', '=', 1);

}

控制器

$order = \App\Models\Order::find(1);
dd($order->status);

错误消息:找不到列:1054'where子句'中的未知列'pivot'(SQL:select {from statuses其中statuseskey = 5和{{1 }} = table和pivot = language_id limit 1)

如果where()没问题,为什么有wherePivot()?
如何正确使用wherePivot?

2 个答案:

答案 0 :(得分:0)

尝试查询结果:

dd($order->status()->where('language_id', 1));

您还可以在模型中使用自定义方法。

有一个专门用于这些内容的软件包:Tinker

答案 1 :(得分:0)

首先,订单和状态之间的关系应该在不同的表中更好地定义,例如'order_status',票证和状态之间的关系应该在表'ticket_status'中

然后你应该像这样定义关系:

在订单模型中

public function status()
{
  return $this->belongsToMany('App\Status', 'order_status’, status_id', ‘order_id’)->withPivot('language_id');
} 

然后这样称呼:

App\Order::find(1)->status()->wherePivot(‘language_id’, 1)->get();

希望它有效..从我的手机打字