Laravel:查询生成器创建复数名称:column_id而不是column_id

时间:2019-03-13 00:48:01

标签: php laravel eloquent laravel-query-builder

我有我的类“ Product_reviews”,该类绑定到这样的类“ Products”:

Products.php:

public function products()
{
    return $this->belongsTo('App\Products');
}

Product_reviews.php:

$products = Products::with('product_reviews')->get();

表“ Product_reviews”的外键是“ product_id”。

因此,在控制器中,我试图获取所有数据:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'product_reviews.products_id' in 'where clause' (SQL: select * from `product_reviews` where `product_reviews`.`products_id` in (1, 2))

而且...我有一个错误,说找不到product_id:

{{1}}

如果我错了,请纠正我,但是我认为查询生成器正在将“ _id”添加到类的名称中。可以通过转到表“ product_reviews”并通过'products_id'更改'product_id'来解决。或者也许我可以将所有类和表的名称传递为单数。

所以我的问题是:为了使查询生成器知道正确的列名,我还有什么其他选择?

2 个答案:

答案 0 :(得分:2)

您的模型应以单数形式命名,然后Laravel将不会尝试在生成的SQL查询中使用列名的复数形式。

在您的情况下,Products模型应称为Product。请记住,模型代表数据库中的一个记录,因此单数形式是正确的。

您通过手动设置$this->hasMany(..)关系中的外来字段来改写此行为,这种情况绕过了问题,但没有解决根本原因。

此外,您应该避免使用snake_cased类名,因为它违反了PSR。您的Product_reviews模型应称为ProductReview

答案 1 :(得分:0)

好吧,我明白了

Products.php中:

return $this->hasMany('App\Product_reviews');

我为hasMany函数添加了2个参数,如下所示:

return $this->hasMany('App\Product_reviews','product_id','id');

这些参数指定ID的名称。

这篇文章确实有帮助:

laravel-hasmany-and-belongsto-parameters

无论如何,我认为从长远来看,按照Davit和hktang的话说,并以单数名称重命名我的班级可能会很好。感谢您的回答。