2014-09-25 2 views
0

Gallery.php:Как получить принадлежность к модели, не делая новых запросов db в Laravel?

<?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

Просто мысли, но не один из галереи классов или изображений имеют hasOne отношения к другим, вместо оба они имеют принадлежность к? – Adimeus

+0

@Adimeus Вы правы. Я отредактировал свой вопрос. К сожалению, это не решает проблему. Я «выбираю» из «галерей», где «galleries'.'cover_image_id' =? Limit 1» для каждой «галереи». – Craft

ответ

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 относится к той же строке в БД.

Это, как говорится, вам нужны нетерпеливый нагрузки gallery на изображениях:

return Response::json(Gallery::with('coverImage.gallery')->get()); 
+0

Хорошо, это намного лучше, но он создает два одинаковых запроса. Это лучший и единственный способ добиться того, что мне нужно? – Craft

+0

это самое простое решение, которое требует только нескольких букв кода. Если вы беспокоитесь о производительности, используйте вместо этого соединение. –

Смежные вопросы