使用with()方法与find()方法一起返回所有模型实例而不是laravel中的一个实例

时间:2016-01-06 09:09:32

标签: php laravel

这是我的产品型号:

class Product extends Model
    {
        protected $primaryKey = 'product_id';
        public    $guarded    = ['created_at', 'updated_at'];

        public function product_pics ()
        {
            return $this->hasMany('App\ProductPics');
        }

    }

这是 ProductPics 型号:

class ProductPics extends Model
{
    public    $timestamps = false;
    protected $fillable   = ['pic_name'];
    protected $primaryKey = 'pic_id';

    public function product ()
    {
        return $this->belongsTo('App\Product');
    }
}

现在我想在ProductController show()方法中获取特定产品及其所有产品图片。为此我写了这个:

public function show ($id)
        {
            $product    =   Product::find($id)->with('product_pics')->get();
            return $product;

            return view('main.pages.product')->with(['product'=> $product]);
        }

但与预期相反,虽然我使用find()方法只选择一个Model,但它会返回一组包含相关产品图片的所有Products模型。

有什么问题?

1 个答案:

答案 0 :(得分:3)

这是因为你在最后一部分使用了get()。移除get()并更改方法的顺序,因为find()方法返回Illuminate\Database\Eloquent\ModelCollection

所以要解释一下你的案例中发生了什么:它找到并且返回具有给定$id的模型。然后,您使用静态方法Product然后with( .. )对返回的get()模型开始新查询,将所有结果作为Collection返回。< / p>

编程风格可能更清晰:

$product = Product::find($id); // SELECT * FROM products WHERE `id` = $id
// $product is now the model Product with loaded data from the DB.

$product = $product->with('product_pics')->get(); // SELECT * FROM products JOIN product_pics ON ... 
// $product var is replaced with the collection of all products of the DB.

将您的方法重写为以下内容以使其正常工作:

public function show ($id)
{
    $product = Product::with('product_pics')->find($id);

    return view('main.pages.product')->with(['product'=> $product]);
}