默认情况下,laravel支持数据透视表中的两个foreing_key。附加和分离方法都可以正常工作。但是,如果我们在数据透视表中有三重外键,那么检索数据并将其插入数据透视表的正确方法是什么。
表
Orders:
id bill_number
Products
id name
Colors
id name
order_details:
id order_id product_id color_id price
我的模型:
class Order extends Model
{
public function client() {
return $this->belongsTo('AppClient');
}
public function items() {
return $this->belongsToMany('AppProduct', 'order_items');
}
}
class Product extends Model
{
//
public function orders() {
return $this->belongsToMany('AppOrder', 'order_items');
}
}
class Color extends Model
{
//
public function orders() {
return $this->belongsToMany('AppOrder', 'order_items');
}
}
现在我想获取或插入具有以下属性的order_items:
order_id product_id color_id price
1 1 1 800
产品:
- 衬衫
- 喘气
- 夹克
颜色:
- 灰色
- 白
- 黑
现在我想列出所有订单项目的产品名称,颜色和价格; 如果我想插入一件黑色衬衫订单,价格为800,我应该如何计算?另外,如果我列出所有带有颜色和价格的订单项目,我应该使用哪种方法?
您可以使用中间表模型。然后,您可以在该模型上定义与颜色的关系。
有点"hacky",但您可以使用withPivot
和wherePivot
。
class Product extends Model
{
public function orders() {
return $this->belongsToMany('AppOrder', 'order_items')->withPivot('color_id', 'price');
}
}
然后,您可以插入如下新记录:
$product->orders()->attach($orderId, ['color_id' => 1, 'price' => 800]);
并使用以下方法进行查询:
$products = Product::whereHas('orders', function ($query) {
$query->where('color_id', '=', 1);
})->get();
我会使用双数据透视表,使用相同的order_id进行order_product和order_color。另一种解决方案是使用多态关系 https://laravel.com/docs/5.8/eloquent-relationships#polymorphic-relationships
我终于用sql join作为下面:
class Order extends Model
{
public function items() {
return $this->belongsToMany('AppProduct', 'order_details')->withPivot('id', 'price')
->join('colors', 'order_details.color_id', '=', 'colors.id')
->select('products.*', 'colors.name as color_name');
}
}