2017-01-28 3 views
0

おはようございます。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'); 

すべてのヘルプやアドバイスが高く評価されています。ありがとうございました。

答えて

0

私は、すべての質問を照会し、いくつかのリクエストを行い、その結果のEloquent Collectionsを結合しようとしました。それから私はいくつかの研究を行い、最終的に私が間違った方向に進むことにしました。リポジトリと仕様のようなパターンを使用して必要なロジックを実現する方が良いです。