laravel第二个联接返回查询为null

时间:2019-02-10 08:27:01

标签: php laravel query-builder

我有这个查询

$products = DB::table('product_attributes')
        ->where('product_attributes.attribute_id', '=', $attri->id)
        ->joinoin('products', 'products.id', '=',
        ->get();

它返回

Collection {#2788 ▼
  #items: array:2 [▼
    0 => {#2785 ▶}
    1 => {#2786 ▶}
  ]
}

但是我无法访问我的产品封面图片,因此我将查询更改为:

$products = DB::table('product_attributes')
        ->where('product_attributes.attribute_id', '=', $attri->id)
        ->join('products', 'products.id', '=', 'product_attributes.product_id')
        ->join('covers', 'covers.imageable_id', '=', 'products.id')
        ->get();

并返回:

Collection {#2805 ▼
  #items: []
}

空!

同样,我将查询更改为:

$products = DB::table('product_attributes')
        ->where('product_attributes.attribute_id', '=', $attri->id)
        ->leftJoin('products', 'products.id', '=', 'product_attributes.product_id')
        ->leftJoin('covers', 'covers.imageable_id', '=', 'products.id')
        ->get();

并返回:

Collection {#2807 ▼
  #items: array:2 [▼
    0 => {#2804 ▶}
    1 => {#2805 ▶}
  ]
}

但仍无法访问我的封面(与我的第一个查询相同)。

问题

如何通过其他所有型号关系访问我的产品?

更多...

这与我的产品型号还有其他关系

public function covers()
    {
        return $this->hasMany(Cover::class, 'imageable_id');
    }

    public function photos()
    {
        return $this->hasMany(Photo::class, 'imageable_id');
    }

    public function options(){
        return $this->belongsToMany(Option::class, 'product_options', 'product_id', 'option_id');
    }

    public function attributes(){
        return $this->belongsToMany(Attribute::class, 'product_attributes', 'product_id', 'attribute_id');
    }

    public function categories(){
        return $this->belongsToMany(Category::class, 'product_categories', 'product_id', 'category_id');
    }

2 个答案:

答案 0 :(得分:0)

如果建立了关系,则可以通过以下方式进行:

$products = Product::with(['covers','attributes'])->whereHas('attributes', function ($query) use ($attri) {
      $query->where('product_attributes.attribute_id', $attri->id);
})->get();

这样,您将获得所有具有给定标识符属性的产品,并且还将检索这些产品的封面和属性。

例如,要访问第一个产品中的封面或属性,您可以执行$products->first()->covers

答案 1 :(得分:0)

仅初始化主对象

$product = Product::findOrFail($id);

使用关系作为对象。不使用查询生成器。

$product->covers();
$product->photos();