2017-01-28 24 views
0

向大家致以問候。Laravel ManyToMany馬上加入條件

如何在Laravel 5.3中爲belongsToMany(多對多)關係添加條件以「加入」?

例如,假設這裏有產品和具有多對多關係的產品的參數。當我想要獲取特定產品的所有參數時,它就好了。我做$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; 

但我沒有找到,如果有做正確的清潔方式它與Laravel能夠從我需要的額外數據中獲得Eloquent \ Relation對象的功能。

我發現「壞」的方式,這是「獲取」我想從查詢生成器對象需要的連接,並添加另一個「其中」,但它是非常醜陋的,我不知道它會工作在未來沒有問題。

這就是我試圖做的,它幾乎工作(有PDO參數的數量不正確的問題,但它產生的SQL,我需要):

$relation = $this->belongsToMany(Parameter::class, 'product_parameters'); 
$relation->getQuery()->getQuery()->joins[0]->where('parameters.definition', '=', 0, 'or'); 

任何幫助或建議表示讚賞。謝謝。

回答

0

我已經留下了原創的想法,將所有內容放在查詢中,試圖做出幾個請求併合並生成的雄辯集合。然後我做了一些研究,最終我決定了我錯了什麼方式,最好使用Repository和Specification等模式來實現所需的邏輯。