如何获取belongsTo模型而不在Laravel中创建新的数据库请求?

时间:2014-09-25 13:09:42

标签: php laravel eloquent

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()方法它有画廊。

如何避免它?

1 个答案:

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