这是我的产品型号:
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模型。
有什么问题?
答案 0 :(得分:3)
这是因为你在最后一部分使用了get()
。移除get()
并更改方法的顺序,因为find()
方法返回Illuminate\Database\Eloquent\Model
或Collection
。
所以要解释一下你的案例中发生了什么:它找到并且返回具有给定$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]);
}