J'ai un phone_models, phone_problems et un tableau pivotant phone_model_phone_problem. Le tableau croisé dynamique a une colonne supplémentaire "prix".
Modèle de téléphone:
class PhoneModel extends \Eloquent
{
public function problems()
{
return $this->belongsToMany('RL\Phones\Entities\PhoneProblem')->withPivot('price');
}
}
PhoneProblem:
class PhoneProblem extends \Eloquent
{
public function models()
{
return $this->belongsToMany('PhoneModel')->withPivot('price');
}
}
Ce que j'essaie de faire est d'obtenir le prix d'un téléphone spécifique avec un problème spécifique.
C’est comme cela que je l’ai maintenant mais j’ai l’impression que Laravel a une fonctionnalité Eloquent intégrée que je ne parviens pas à faire de manière beaucoup plus simple:
$model = $this->phoneService->getModelFromSlug($model_slug);
$problem = $this->phoneService->getProblemFromSlug($problem_slug);
tout ce que cela fait est de sélectionner le modèle spécifique et le problème de leur slug.
alors ce que je fais est avec ces informations d'identification je reçois le prix comme suit:
$row = DB::table('phone_model_phone_problem')
->where('phone_model_id', '=', $model->id)
->where('phone_problem', '=', $problem->id)
->first();
alors maintenant je peux obtenir le prix comme si $row->price
mais j’ai le sentiment qu’il doit exister un moyen beaucoup plus facile et plus "Laravel" de le faire.
Lorsque vous utilisez des relations plusieurs à plusieurs avec Eloquent, le modèle résultant se voit automatiquement attribuer un attribut pivot
. Grâce à cet attribut, vous pouvez accéder aux colonnes du tableau croisé dynamique. Bien que par défaut il n'y ait que les clés dans l'objet pivot. Pour obtenir également vos colonnes, vous devez les spécifier lors de la définition de la relation:
return $this->belongsToMany('Role')->withPivot('foo', 'bar');
Si vous avez besoin de plus d'aide pour configurer les relations avec Eloquent, faites-le moi savoir.
Modifier
Pour interroger le prix, faites ceci
$model->problems()->where('phone_problem', $problem->id)->first()->pivot->price
Pour obtenir les données du tableau croisé dynamique:
$price = $model->problems()->findOrFail($problem->id, ['phone_problem'])->pivot->price;
Ou si vous avez plusieurs disques avec des prix différents:
$price = $model->problems()->where('phone_problem', $problem->id)->firstOrFail()->pivot->price;
En outre.
Pour mettre à jour les données du pivot, vous pouvez aller NEW WAY :
$model->problems()->sync([$problemId => [ 'price' => $newPrice] ], false);
Où le paramètre 2nd est défini sur false, ce qui signifie que vous ne détachez pas tous les autres modèles associés.
Ou, allez à l'ancienne
$model->problems()->updateExistingPivot($problemId, ['price' => $newPrice]);
Et rappelez-vous:
Pour supprimer :
$model->problems()->detach($problemId);
Pour créer nouveau:
$model->problems()->attach($problemId, ['price' => 22]);
Il a été testé et prouvé en travaillant dans Laravel 5.1 En savoir plus.