Laravel ManyToMany加入条件

时间:2017-01-28 16:11:13

标签: php mysql laravel laravel-5 laravel-5.3

向大家致以问候。

如何添加条件到"加入"对于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');

感谢任何帮助或建议。谢谢。

1 个答案:

答案 0 :(得分:0)

我保留了最初的想法,将所有内容放在查询中,尝试执行多个请求并组合生成的Eloquent Collections。然后我做了一些研究,最后我决定了我的错误方式,最好使用Repository和Specification等模式来实现所需的逻辑。