Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果有ID,Laravel check有多个有多个关系?_Laravel_Many To Many_Laravel 8 - Fatal编程技术网

如果有ID,Laravel check有多个有多个关系?

如果有ID,Laravel check有多个有多个关系?,laravel,many-to-many,laravel-8,Laravel,Many To Many,Laravel 8,您好,我有以下关系设置: 产品类别: public function attributes() { return $this->hasMany(ProductAttribute::class); } public function values() { return $this->hasManyThrough(ProductAttributeValue::class, ProductAttribute::class);

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

产品类别:

public function attributes()
    {
        return $this->hasMany(ProductAttribute::class);
    }
public function values()
    {
        return $this->hasManyThrough(ProductAttributeValue::class, 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');
    }
如何检查
产品
是否具有ID为
5
15

我试图提出这样一个问题:

Product::whereHas('values', function($q) use ($product_values_ids) {
                    $q->whereIn('attribute_value_id', $product_values_ids);
                })->get();
但是它不起作用。我无法直接访问
$product->values

关于如何直接从
产品
中访问属性值有何建议

更新:

我刚刚设法通过多对多的关系使其工作:

产品类别:

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

有没有办法只获得所有ID都列在
$product\u values\u id
数组中的结果?

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

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();

您正在检查是否存在任何具有这些ID值的产品,或者您希望这些记录与该条件匹配?产品没有
值关系
我想从
$Product\u values\u id
数组中获取所有具有值的产品。是否尝试了嵌套的
whereHas
产品::whereHas('attributes.values',…)->get()?谢谢,我刚刚设法做到了这一点。现在还有一个问题,这个
$q->其中('attribute\u value\u id',$product\u values\u id')我正在获得结果,如果他们拥有所有
$product\u values\u id
,我如何才能获得结果?例如,如果product_values_id为[3、12、20],则只返回包含所有三个id的结果,如果product的id为3和12的值被忽略,则不必使用
,其中
。我建议替换
$q->其中('attribute\u value\u id',$product\u values\u id')带循环和
whereHas
和`$q->where('id',$id);。仅当所有条件都有效时,它才会返回值,但当我执行
$results=$results->whereHas('values',function($q)使用($product_values_id){foreach($product_values_id作为$id){$q->where('attribute_value_id',$id);})我没有得到基于两个valuesTry的结果来澄清。产品有3个属性,每个属性有3个值。我们需要的产品标识:
[1,2]
。第一个变量:一个属性的值为1,第二个为2,第三个为3。产品有1,2,3,适合我们使用。第二个变量:一个属性的值为[1,2],第二个为3,第三个为4。产品有1,2,3,4,attribyte有[1,2],适合我们。哪种变体是正确的?为了澄清这一点,我们的目标是“过滤”所有具有
$product\u values\u id
提供的所有值的产品。如果产品只有一个提供的值,则不应获取该产品。如果产品具有所有阵列ID,则应获取该产品。刚刚试用了第二个和第三个变体,如果只有一个数组id,它工作得很好,但是当提供的id超过1个时,在
$product\u values\u id
中它不会返回任何内容。