属于拉拉维尔的多个福里昂钥匙

  • 本文关键字:钥匙 属于 laravel
  • 更新时间 :
  • 英文 :


默认情况下,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

产品:

  1. 衬衫
  2. 喘气
  3. 夹克

颜色:

  1. 灰色

现在我想列出所有订单项目的产品名称,颜色和价格; 如果我想插入一件黑色衬衫订单,价格为800,我应该如何计算?另外,如果我列出所有带有颜色和价格的订单项目,我应该使用哪种方法?

您可以使用中间表模型。然后,您可以在该模型上定义与颜色的关系。

有点"hacky",但您可以使用withPivotwherePivot

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');
}
}

最新更新