[英]Laravel ManyToMany Join On Condition
致大家。
如何在Laravel 5.3中为beforeToMany(多对多)关系在“ 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;
当我想在Parameter上定义一些“全局”标志时出现问题,该标志定义该Parameter应该绑定到每个产品。 使用普通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');
任何帮助或建议,不胜感激。 谢谢。
我留下了最初的想法,将所有内容放入查询中,尝试执行多个请求并合并生成的Eloquent Collections。 然后我做了一些研究,最后我确定了我要走错的路,最好使用存储库和规范之类的模式来实现所需的逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.