web-dev-qa-db-ja.com

追加のピボットテーブル列の値の取得laravel

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」な方法が必要だと感じています。

51
Rodrigo

Eloquentで多対多の関係を使用する場合、結果のモデルにはpivot属性が自動的に割り当てられます。その属性を介して、ピボットテーブルの列にアクセスできます。デフォルトでは、ピボットオブジェクトにはキーのみがあります。列もそこに入れるには、関係を定義するときに列を指定する必要があります。

return $this->belongsToMany('Role')->withPivot('foo', 'bar');

公式ドキュメント

Eloquentとの関係を構成するタスクでさらにサポートが必要な場合は、お知らせください。

編集

価格を照会するには、これを行います

$model->problems()->where('phone_problem', $problem->id)->first()->pivot->price
109
lukasgeiter

ピボットテーブルからデータを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でテストされ、動作することが証明されました 続きを読む。

12