Gallery.php:
<?php
class Gallery extends Eloquent {
protected $visible = array(
'title',
'slug',
'id'
);
public function coverImage() {
return $this->belongsTo('Image', 'cover_image_id');
}
}
Image.php:
<?php
class Image extends Eloquent {
protected $visible = array(
'id',
'url'
);
protected $appends = array(
'url'
);
public function gallery() {
return $this->hasOne('Gallery', 'cover_image_id');
}
public function getUrlAttribute() {
$slug = $this->gallery->slug;
return '/images/' . $slug . '/' . $slug . '-' . $this->id . '.jpg';
}
}
我想要的是:
return Response::json(Gallery::all()->with('coverImage')->get());
我希望每个coverImage
都拥有url
属性。它有...但是Laravel正在查询每个图库的日期库以获得slug
,尽管因为with()
方法它有画廊。
如何避免它?
答案 0 :(得分:1)
您需要了解雄辩关系的运作方式。它们不是双向的。所以:
$model = Model::with('related')->first(); // loads related on model
$model->related; // eager loaded
// but
$model->related->model; // not eager loaded, so requires query
即使$model
和->model
引用了DB中的同一行,最后一行也是如此。
话虽如此,您需要在图片上加载gallery
:
return Response::json(Gallery::with('coverImage.gallery')->get());