Laravel Eloquent Eager Loading假定数据透视表列名称不正确

时间:2017-08-10 16:59:41

标签: php mysql laravel eloquent

我在Laravel 5.4中有两张桌子。通过多对多关系加入的订单和产品

我试图与相关产品一起获取所有订单,如下所示:

$orders = Orders::with('products')->get();

我的订单模型将此设置为

public function products()
{
    return $this->belongsToMany('App\Product')
        ->withPivot('qty')
        ->withTimeStamps();
}

当我输出日志时,我收到以下错误消息:

Next Illuminate\Database\QueryException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'order_product.order_order_id' in 'field list' (SQL: select `products`.*, `order_product`.`order_order_id` as `pivot_order_order_id`, `order_product`.`product_product_id` as `pivot_product_product_id`, `order_product`.`qty` as `pivot_qty`, `order_product`.`created_at` as `pivot_created_at`, `order_product`.`updated_at` as `pivot_updated_at` from `products` inner join `order_product` on `products`.`product_id` = `order_product`.`product_product_id` where `order_product`.`order_order_id` in (66, 67, 70, 72, 73, 74) and `products`.`deleted_at` is null) in /home/vagrant/Projects/vcc-backoffice/vendor/laravel/framework/src/Illuminate/Database/Connection.php:647

问题在于Laravel正在Pivot中寻找一个名为" order_order_id "哪个不存在。我还没有宣布要调用该列。我的数据透视表列名为" order_id "和" product_id "

我不知道Laravel如何假设数据透视表名称。有没有办法在数据透视中专门声明列名?或者我在命名约定中犯了错误?

2 个答案:

答案 0 :(得分:1)

如果您有两个名为Order&的模型Product之间的orders和many_to_many关系与他们的数据库表格如products& order_product然后Laravel将搜索名为order_product的数据透视表(模型名称按字母顺序排列并加入' _')。 order_id表格由两列product_idLOAD CSV WITH HEADERS FROM "file:/Users/MATT/Documents/LL.csv" As csvline MATCH(n) RETURN n 组成。简而言之,这是数据透视表的基本命名约定:)。

答案 1 :(得分:0)

修改订单模型并尝试以下代码:

public function products()
{
    return $this->belongsToMany('App\Product','order_product','order_id','product_id')
        ->withPivot('qty')
        ->withTimeStamps();
}