おはようございます。Laravel ManyToMany参加条件
Laravel 5.3のbelongsToMany(多対多)リレーションの条件に「join on」を追加するにはどうすればよいですか?
たとえば、ここでは、多対多の関連性を持つ商品の商品とパラメータについて説明します。特定の製品のすべてのパラメータを取得したい場合は、それだけです。私は$product->parameters
を行うと、それは私がこのようなクエリで必要なものを私に与えます:私は、パラメータはすべての製品にバインドする必要があることを定義するパラメータにいくつかの「グローバル」フラグを定義したいとき
SELECT
parameters.*,
product_parameters.product_id AS pivot_product_id,
product_parameters.parameter_id AS pivot_parameter_id
FROM parameters
INNER JOIN product_parameters ON parameters.id = product_parameters.parameter_id
WHERE product_parameters.product_id = 1;
問題が表示されます。プレーンなSQLでは、私がしなければならないすべては、このようなOR parameters.global = 1、参加するために条件を追加することです:
SELECT
parameters.*,
product_parameters.product_id AS pivot_product_id,
product_parameters.parameter_id AS pivot_parameter_id
FROM parameters
INNER JOIN product_parameters ON parameters.id = product_parameters.parameter_id OR parameters.global = 1
WHERE product_parameters.product_id = 1;
をしかし行うには正しいとクリーンな方法があれば、私は見つけられませんでしたそれは私が必要とする追加のデータで関数からEloquent \ Relationオブジェクトを戻すことができるLaravelと一緒に。
私はクエリビルダーオブジェクトから必要な結合を「フェッチ」し、別の「場所」を追加することが「悪い」方法を見つけましたが、それは非常に醜いです。将来的には問題はありません。 (PDOパラメータの数が正しくありませんとの問題を抱えているが、それは私が必要なSQLを生成します)
これは私がしようとしたものであり、それはほとんど働いていた:
$relation = $this->belongsToMany(Parameter::class, 'product_parameters');
$relation->getQuery()->getQuery()->joins[0]->where('parameters.definition', '=', 0, 'or');
すべてのヘルプやアドバイスが高く評価されています。ありがとうございました。