2017-01-28 5 views
0

Приветствую всех.Laravel ManyToMany Регистрация Состояние

Как я могу добавить условие для «join on» для атрибута ownToMany (многие ко многим) в Laravel 5.3?

Например, предположим, что это Продукты и параметры этих продуктов со многими отношениями. Когда я хочу получить все параметры для конкретного продукта, это просто отлично. Я $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; 

Проблема возникает, когда я хочу, чтобы определить, какой-то «Global» флаг на параметр, который определяет, что параметр должен быть привязан к каждому продукту. С простым SQL, все, что нужно сделать, это добавить условие JOIN, ИЛИ 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

Я оставил оригинальную идею разместить все в запросах, попытался выполнить несколько запросов и объединить полученные Eloquent Collections. Затем я провел некоторое исследование, и в конце концов я решил, что я ошибался, и лучше использовать такие шаблоны, как репозиторий и спецификацию, для достижения требуемой логики.

Смежные вопросы