向大家致以问候。
如何添加条件到"加入"对于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;
当我想定义一些" Global" flag参数,用于定义参数应绑定到每个Product。使用纯SQL,我所要做的就是将条件添加到JOIN, 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对象从函数返回我需要的其他数据。
我发现"坏"方式,这是" fetch"从查询构建器对象加入我需要的并添加另一个"其中"对它来说,但它非常难看,而且我不确定它将来会不会有问题。
这是我试过的,它几乎可以工作(PDO参数数量不正确有问题,但是它生成了我需要的SQL):
$relation = $this->belongsToMany(Parameter::class, 'product_parameters');
$relation->getQuery()->getQuery()->joins[0]->where('parameters.definition', '=', 0, 'or');
感谢任何帮助或建议。谢谢。
答案 0 :(得分:0)
我保留了最初的想法,将所有内容放在查询中,尝试执行多个请求并组合生成的Eloquent Collections。然后我做了一些研究,最后我决定了我的错误方式,最好使用Repository和Specification等模式来实现所需的逻辑。