Phone_models、phone_problems、およびphone_model_phone_problemピボットテーブルがあります。ピボットテーブルには追加の列「価格」があります。
PhoneModel:
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');
}
}
私がやろうとしているのは、特定の問題を持つ特定の電話の価格を取得することです。
これは私が今持っている方法ですが、LaravelにはEloquent機能が組み込まれているように感じますが、これをもっと簡単な方法で見つけることはできません:
$model = $this->phoneService->getModelFromSlug($model_slug);
$problem = $this->phoneService->getProblemFromSlug($problem_slug);
これは、スラッグから特定のモデルと問題を選択するだけです。
その後、私はそれらの資格情報を使用して、次のような価格を取得します:
$row = DB::table('phone_model_phone_problem')
->where('phone_model_id', '=', $model->id)
->where('phone_problem', '=', $problem->id)
->first();
だから今は$row->price
のような価格を手に入れることができますが、もっと簡単でもっと「Laravel」な方法が必要だと感じています。
Eloquentで多対多の関係を使用する場合、結果のモデルにはpivot
属性が自動的に割り当てられます。その属性を介して、ピボットテーブルの列にアクセスできます。デフォルトでは、ピボットオブジェクトにはキーのみがあります。列もそこに入れるには、関係を定義するときに列を指定する必要があります。
return $this->belongsToMany('Role')->withPivot('foo', 'bar');
Eloquentとの関係を構成するタスクでさらにサポートが必要な場合は、お知らせください。
編集
価格を照会するには、これを行います
$model->problems()->where('phone_problem', $problem->id)->first()->pivot->price
ピボットテーブルからデータをgetするには:
$price = $model->problems()->findOrFail($problem->id, ['phone_problem'])->pivot->price;
または、異なる価格のレコードが多数ある場合:
$price = $model->problems()->where('phone_problem', $problem->id)->firstOrFail()->pivot->price;
さらに
ピボット内のデータをupdateするには、NEW WAYに移動できます:
$model->problems()->sync([$problemId => [ 'price' => $newPrice] ], false);
2番目のパラメーターがfalseに設定されている場合、他のすべての関連モデルをデタッチしないことを意味します。
または、昔ながらの方法で
$model->problems()->updateExistingPivot($problemId, ['price' => $newPrice]);
そして、あなたに思い出させます:
Todelete:
$model->problems()->detach($problemId);
Tocreatenew:
$model->problems()->attach($problemId, ['price' => 22]);
Laravel 5.1でテストされ、動作することが証明されました 続きを読む。