Laravel有很多关系对象

时间:2014-12-26 06:07:53

标签: laravel eloquent

我对Eloquent

提出了一些问题

我有一张包含很多照片的相册,每张照片都有标签。

我的模型看起来像

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

我怎样才能获得每张照片的标签?

2 个答案:

答案 0 :(得分:0)

要获取每张照片的所有标签,您必须循环播放照片集。

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

在这个例子中,我使用的是Eloquent Collection,因为结果($ photo->标签)也是一个集合。如果你对此更加满意,你也可以使用数组。

并且不要忘记eager load您的关系,否则将为集合中的每个模型查询数据库。

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

答案 1 :(得分: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');
   }
}