【问题标题】:Laravel check hasMany of hasMany relationship if has IDs?Laravel 检查 hasMany 的 hasMany 关系是否有 ID?
【发布时间】:2021-01-27 21:55:54
【问题描述】:

您好,我有以下关系设置:

产品类别:

public function attributes()
    {
        return $this->hasMany(ProductAttribute::class);
    }

ProductAttribute 类:

public function attribute()
    {
        return $this->belongsTo(Attribute::class);
    }

    public function values()
    {
        return $this->hasMany(ProductAttributeValue::class, 'product_attribute_id');
    }

ProductAttributeValue 类:

public function attributeValue()
    {
        return $this->belongsTo(AttributeValue::class, 'attribute_value_id');
    }

如何检查Product 是否有values,ID 为515

我正在尝试进行这样的查询:

Product::whereHas('values', function($q) use ($product_values_ids) {
                    $q->whereIn('attribute_value_id', $product_values_ids);
                })->get();

但是它不起作用。我无法直接访问$product->values

关于如何从Product 直接访问属性值有什么建议吗?

更新:

我刚刚设法使它与多对多槽关系一起工作:

产品类别:

public function values()
    {
        return $this->hasManyThrough(ProductAttributeValue::class, ProductAttribute::class);
    }

有没有办法只获取包含$product_values_ids 数组中列出的所有 id 的结果?

【问题讨论】:

  • 您正在检查是否存在任何具有这些 id 值的产品,或者您希望这些记录符合该条件?产品没有values 关系
  • 我想获取所有具有 $product_values_ids 数组值的产品。
  • 你试过嵌套的whereHasProduct::whereHas('attributes.values', ...)->get();吗?

标签: laravel many-to-many laravel-8


【解决方案1】:

您必须添加与产品模型的新关系:

public function values(): HasManyThrough
{
    return $this->hasManyThrough(ProductAttributeValue::class, ProductAttribute::class);
}

然后:

$builder = Product::query();
foreach($product_values_ids as $id) {
    $builder->whereHas('values', function($q) use ($id) {
        $q->where('id', $id);
    });
}

$product = $builder->get();

【讨论】:

  • 谢谢,我刚刚设法做到了这一点。剩下一个问题,目前这个$q->whereIn('attribute_value_id', $product_values_ids); 我正在得到结果,只有当他们拥有所有$product_values_ids 时我才能得到结果?例如,如果 product_values_ids 为 [3, 12, 20] 仅返回具有所有三个 id 的结果,并且如果产品具有 id 3 和 12 的值要被忽略?
  • 您不必使用whereIn。我建议用循环替换$q->whereIn('attribute_value_id', $product_values_ids);whereHas 和`$q->where('id', $id);。只有在所有条件都有效时它才会返回值
  • 好建议,但是当我这样做时 $results = $results->whereHas('values', function($q) use ($product_values_ids) {foreach ($product_values_ids as $id){$q->where('attribute_value_id', $id);} }); 我没有得到基于两个值的结果
  • 试着澄清一下。产品有 3 个属性,每个属性都有 3 个值。我们需要的产品 ID:[1,2]。第一个变体:一个属性的值是 1,第二个是 2,第三个是 3。产品有 1,2,3,它适合我们。第二种变体:一个属性的值是 [1,2],第二个是 3,第三个是 4。产品有 1,2,3,4,attribyte 有 [1,2],它适合我们。哪个变体是正确的?
  • 为了澄清目标是“过滤”具有$product_values_ids 提供的所有值的所有产品。如果产品只有一个提供的值,则不应获取它。如果产品具有所有数组 ID,则应获取它。刚刚尝试了第二个和第三个变体,如果只有一个数组id,它工作得很好,但是当提供的id超过1个时,在$product_values_ids它什么都不返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2019-08-12
  • 2020-05-31
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多