Laravel:查询生成器创建复数名称:columns_id 而不是 column_id
Laravel: Query Builder creates plural name: columns_id instead of column_id
我有我的 class "Product_reviews",它像这样绑定到 class "Products":
Products.php:
public function product_reviews()
{
return $this->hasMany('App\Product_reviews');
}
Product_reviews.php:
public function products()
{
return $this->belongsTo('App\Products');
}
table "Product_reviews" 的外键是 'product_id'。
因此,在控制器中我试图获取所有数据:
$products = Products::with('product_reviews')->get();
还有...我有一个错误提示找不到 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))
如果我错了请纠正我,但我认为查询构建器正在将“_id”添加到 class' 名称。它可以通过转到 table "product_reviews" 并通过 'products_id' 更改 'product_id' 来修复...或者也许我可以通过所有 classes' 和 tables 的名字为单数。
所以我的问题是:我还有哪些其他选项可以让查询构建器知道正确的列名称?
好的,我知道了:
在Products.php中:
return $this->hasMany('App\Product_reviews');
我向函数 hasMany 添加了 2 个参数,如下所示:
return $this->hasMany('App\Product_reviews','product_id','id');
这些参数指定了 id 的名称。
这个 post 真的很有帮助:
无论如何,从长远来看,我认为按照 Davit 和 hktang 的说法,用单数名称重命名我的 类 可能会很好。感谢您的回答。
您的模型应以单数形式命名,然后 Laravel 将不会尝试在生成的 SQL 查询中使用列名的复数形式。
在您的情况下,Products
模型应称为 Product
。请记住,模型代表数据库中的 一条 条记录,因此单数形式是正确的。
您通过在 $this->hasMany(..)
关系中手动设置外部字段来覆盖此行为,这绕过了问题,但没有解决根本原因。
此外,您应该避免使用 snake_cased class 名称,因为它违反了 PSR。您的 Product_reviews
模型应称为 ProductReview
。
我有我的 class "Product_reviews",它像这样绑定到 class "Products":
Products.php:
public function product_reviews()
{
return $this->hasMany('App\Product_reviews');
}
Product_reviews.php:
public function products()
{
return $this->belongsTo('App\Products');
}
table "Product_reviews" 的外键是 'product_id'。
因此,在控制器中我试图获取所有数据:
$products = Products::with('product_reviews')->get();
还有...我有一个错误提示找不到 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))
如果我错了请纠正我,但我认为查询构建器正在将“_id”添加到 class' 名称。它可以通过转到 table "product_reviews" 并通过 'products_id' 更改 'product_id' 来修复...或者也许我可以通过所有 classes' 和 tables 的名字为单数。
所以我的问题是:我还有哪些其他选项可以让查询构建器知道正确的列名称?
好的,我知道了:
在Products.php中:
return $this->hasMany('App\Product_reviews');
我向函数 hasMany 添加了 2 个参数,如下所示:
return $this->hasMany('App\Product_reviews','product_id','id');
这些参数指定了 id 的名称。
这个 post 真的很有帮助:
无论如何,从长远来看,我认为按照 Davit 和 hktang 的说法,用单数名称重命名我的 类 可能会很好。感谢您的回答。
您的模型应以单数形式命名,然后 Laravel 将不会尝试在生成的 SQL 查询中使用列名的复数形式。
在您的情况下,Products
模型应称为 Product
。请记住,模型代表数据库中的 一条 条记录,因此单数形式是正确的。
您通过在 $this->hasMany(..)
关系中手动设置外部字段来覆盖此行为,这绕过了问题,但没有解决根本原因。
此外,您应该避免使用 snake_cased class 名称,因为它违反了 PSR。您的 Product_reviews
模型应称为 ProductReview
。