2017-06-29 102 views
4

我使用多對多的關係。我想爲這個屬性設置兩個值。Laravel多對多

產品,

屬性,

attribute_product =>product_id,attribute_id,value

enter image description here

我知道這是錯的,但我想告訴你,我想

$product->attributes()->sync([ 
      1 => [ 
       'value' => 'sky' 
      ], 
      1 => [ 
       'value' => 'night' 
      ], 
     ]); 

更新2

Schema::create('attribute_product', function (Blueprint $table) { 

$table->unsignedInteger('product_id'); 
$table->unsignedInteger('attribute_id'); 
$table->text('value')->nullable(); 
$table->integer('devalue_id')->nullable(); // value id 

$table->primary(['product_id', 'attribute_id', 'devalue_id']); 

}); 

更新1

我需要設置的天空,晚上

product_id attribute_id  value  devalue_id 
1   1     sky   1 
1   1     night  2 
... 
+1

請您重新說明一下嗎? –

+0

@ImAtWar https://www.digikala.com/Product/DKP-149283此筆記本電腦具有多個attributs值: –

+0

用法:多媒體,窄和光。它如何保存這個值 –

回答

1

我不是100%肯定,你想要做的,所以我會解決兩種不同的情況。

1:創建一個屬性並將其鏈接到產品。在這種情況下,您有一個產品並知道屬性的名稱,但它尚未存在於您的屬性表中。它看起來像這樣:

$product->attributes()->saveMany([ 
    new App\Attribute(['title' => 'sky']), 
    new App\Attribute(['title' => 'night']), 
]); 

2:將現有屬性附加到產品。在這種情況下,您的屬性表中已經有屬性並查看了它。實際上,它非常相似,除了找到屬性。

$attribute1 = Attributes::where('title', 'sky')->first(); 
$attribute2 = Attributes::where('title', 'night')->first(); 

$product->attributes()->saveMany([ 
    $attribute1, 
    $attribute2, 
]); 
+0

$ product-> attributes() - > detach(); $ product-> attributes() - > attach([...]);我現在正在做這個 –

+0

而不是先做分離,你實際上可以使用$ product-> sync([...]),它將擺脫不在數組中的任何屬性,並添加任何是。代碼中有點整齊。 :) – llhilton

+0

同步不適用於** 3主鍵*** –

2

這樣的事情,我可以看到2個選項:

手動安裝和拆卸所需的記錄。這可能會導致檢索數據時出現問題,因爲它會返回多個相同的屬性,但是,您可能會在集合上使用groupBy來解決此問題(如果它是針對您的)。

2.

你可以在樞軸表中的值列中存儲一個JSON對象。這將允許您爲同一個屬性擁有多個值。要做到這一點,你可以創建一個AttributeProductPivot類(或任何你想將它命名),擴展Illuminate\Database\Eloquent\Relations\Pivot並添加蒙上屬性,它即:

class AttributeProductPivot extends \Illuminate\Database\Eloquent\Relations\Pivot 
{ 
    /** 
    * The attributes that should be casted to native types. 
    * 
    * @var array 
    */ 
    protected $casts = [ 
     'value' => 'collection', //or object or array 
    ]; 

} 

然後改變你的attributes()關係是:

public function attributes() 
{ 
    return $this->belongsToMany(Attribute::class) 
     ->using(AttributeProductPivot::class) 
     ->withPivot('value'); 
} 

using()允許你設置一個不同的Pivot Model,它是默認的。如果需要,不要忘記對相反的關係做同樣的事情。

在附加/同步時,您需要自己將value屬性強制轉換爲json。

希望這會有所幫助!

+0

你的意思是在夜間像json一樣保存天空? –

+0

{「Sky」,「Night」} mysql是否容易搜索值?獲取屬性爲天空的帖子 –

+0

我應該如何處理我的主鍵 - 2/3? –