2017-06-29 1 views
4

J'utilise de nombreuses relations. Je veux définir deux valeurs pour cet attribut.Laravel multiple many to many

produit,

attributs,

attribute_product =>product_id,attribute_id,value

enter image description here

Je sais qu'il est mal, mais je veux vous montrer que je veux

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

Mise à jour 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']); 

}); 

Update 1

je dois mettre le ciel, la nuit

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

Pourriez-vous, s'il vous plaît, reformuler? –

+0

@ImAtWar https://www.digikala.com/Product/DKP-149283 Cet ordinateur portable a plusieurs valeur pour les attributs: –

+0

utilisation: multimédia, étroit et léger. comment sauvegarde-t-il ces valeurs –

Répondre

1

Je ne suis pas 100% sûr de ce que vous voulez faire, donc je vais aborder deux scénarios différents.

1: Créez un attribut et liez-le à un produit. Dans ce cas, vous avez un produit et connaissez le nom d'un attribut, mais ce n'est pas encore dans votre table d'attributs. Cela ressemblerait à quelque chose comme:

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

2: Attacher un attribut existant à un produit. Dans ce cas, vous avez déjà l'attribut dans votre table d'attributs et l'avez recherché. C'est assez similaire, en fait, sauf pour trouver les attributs.

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

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

$ product-> attributes() -> detach(); $ product-> attributes() -> attach ([...]); Je fais cela maintenant –

+0

Plutôt que de faire le detach en premier, vous pouvez simplement utiliser $ product-> sync ([...]), ce qui va se débarrasser de tous les attributs qui ne sont pas dans le tableau et en ajouter sont. Un peu plus ordonné dans le code. :) – llhilton

+0

synchronisation ne fonctionne pas pour moi avec ** clé primaire 3 *** –

2

Pour quelque chose comme cela, je peux voir 2 options:

1.

connecter manuellement et Détacher les enregistrements que vous voulez. Cela peut conduire à des problèmes avec la façon dont vous récupérez les données, car il retournera plusieurs attributs identiques, cependant, vous pourriez potentiellement utiliser groupBy sur la collection pour contourner ce problème (si c'est un pour vous).

2.

Vous pouvez stocker un objet JSON dans la colonne de valeur sur le tableau croisé dynamique. Cela vous permettrait d'avoir plusieurs valeurs pour le même attribut. Pour ce faire, vous pouvez créer une AttributeProductPivot classe (ou tout ce que vous voulez l'appeler) qui va Illuminate\Database\Eloquent\Relations\Pivot et ajouter une jette bien à ce savoir:

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 
    ]; 

} 

Ensuite, changez votre relation attributes() être:

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

Le using() vous permet de définir un modèle de Pivot différent de celui par défaut. N'oubliez pas de faire la même chose pour la relation inverse si vous en avez besoin.

Vous devez attribuer l'attribut value à json lors de la connexion/synchronisation.

Espérons que cela aide!

+0

Vous voulez dire sauver le ciel, la nuit dans un champ comme json? –

+0

{"Sky", "Night"} est-il facile pour mysql de rechercher des valeurs? obtenir des messages où l'attribut est le ciel –

+0

Que dois-je faire avec mes clés primaires - 2/3? –