2014-12-26 8 views
-1

У меня есть вопрос о EloquentLaravel hasmany отношение объект

У меня в альбоме много фотографий, и на каждой фотографии есть теги.

моя модель выглядеть

class Album extends Eloquent { 
    public function photo() { 
     return $this->hasMany('Photo','album_id')->select('url_thumb', 'url_natual',  'url_thumb_tiny'); 
    } 
} 

    class Photo extends Eloquent { 
     public function tags() { 
     return $this->hasMany('PhotoTags','photo_id')->select(array('x', 'y','width','height','msg')); 
     } 
    } 

class PhotoTags extends Eloquent { 
    public function photo() { 
     return $this->belongsTo('Photo','photo_id'); 
    } 
} 

Мой контроллер выглядит

class AlbumController extends Controller { 
     protected $data = []; 

     public function __construct() { 
     $this->data['item'] = Album::where('album_id', '=', $id)- >where('user_id','=',Auth::user()->user_id)->first(); 
     } 

     public function managePhoto($id) { 
     print_r($this->data['item']->photo[0]);     //it's works fine, i can get photos under the album 
     print_r($this->data['item']->photo[0]->tags); //i can't get tags of each photo 
    } 
} 

как я могу получить теги каждой фотографии ???

+0

и можно использовать жадную загрузку, поэтому в контроллере и использовать 'Фото :: с ('тегами) -> получить()' и петлю над ними в представлении, теперь каждый элемент будет выбран вместе с его тег, проверить http://laravel.com/docs/4.2/eloquent#eager-loading – ctf0

ответ

0

ооо .... я уже понять это

это потому, что модель альбома я мисс выберите photo_id

так я изменить код модели, как показано ниже, и это работа ,

class Album extends Eloquent { 
    public function photo() { 
     return $this->hasMany('Photo','album_id')->select('photo_id','url_thumb', 'url_natual',  'url_thumb_tiny'); 
    } 
} 
0

Чтобы получить все метки каждой фотографии, вам придется перебирать коллекцию фотографий.

$photos = $this->data['item']->photo; 
$tags = new \Illuminate\Database\Eloquent\Collection; 
foreach($photos as $photo){ 
    $tags = $tags->merge($photo->tags); 
} 

В этом примере я использую Красноречивый коллекции, так как результат ($ фото-> метки) коллекция тоже. Вы также можете использовать массив, если вам это более удобно.

А также не забудьте указать eager load ваши отношения, иначе db будет запрашиваться для каждой модели в коллекции.

Album::where('album_id', '=', $id) 
    ->where('user_id','=',Auth::user()->user_id) 
    ->with('tags') 
    ->first(); 
+0

спасибо !! это работа ~ –