你好,我有一个名为order_product
的表,我想从中获取值,该表的模型名为order_product
,值为:
public $timestamps = false;
protected $fillable = [
'order_id',
'product_id',
'amount',
];
这是型号Order
的代码:
public $timestamps = true;
protected $fillable = [
'order_number',
'client_id',
'description',
];
public function client()
{
return $this->belongsTo(Client::class);
}
public function products()
{
return $this->belongsToMany(Product::class);
}
public function orders()
{
return $this->belongsToMany(order_product::class);
}
一个专业的家伙帮助我,向我解释了关系是如何工作的,所以client
和products
工作得很好,但orders
在sql中出错。
这是我在控制器中执行的代码:
$orders = Order::where('id', $id)->firstOrFail();
$orders->load('client', 'products','orders');
我得到的错误是:
- 数据库状态[42S02]:未找到基表或视图:1146表格'user_project_db. order_products'不存在**
文件order_product
的名称应该是什么才能正确执行查询?
2条答案
按热度按时间f8rj6qna1#
我在阅读下面的答案后更改了我的答案。
您的表关系是
orders
-order_product
-products
。https://webdevetc.com/blog/laravel-naming-conventions/
在数据透视表下
您命名数据透视表的方式已经正确。
order_product
是以多对多的方式将orders
连接到products
。所以我想你可以试着做以下几点。
在模型产品内部添加此关系。
在模型Order中添加其他连接
belongsToMany
接受2个参数,第一个是模型目标,第二个是表透视名称,在本例中为order_product
。在这种情况下,额外的模型OrderProduct是可选的。
要将产品添加到订单中,可以使用attach
或者,如果透视表中有额外字段
查询价格
然后回到您自己的查询。
无需在Order模型中添加orders()。
并且只加载前2个关系应该就足够了。
$order->load('clients', 'products');
83qze16e2#
模型中的
protected $table = 'order_products;
将告诉LaravelOrder
模型的数据以该名称存储在表中。但是,通常您会有一个订单模型、一个产品模型和一个名为
order_products
的 * 透视表 *(如果需要,可能还带有透视模型)。https://laravel.com/docs/9.x/eloquent-relationships#defining-custom-intermediate-table-models