如何在使用雄辩orm时只让第一个孩子成为父母?

问题描述:

我试图从我的相册表中获取活动(即活动= 1)相册,该相册表中至少有一个活动图像,第一个活动图像按创建日期的降序排列。即每张专辑的图像必须是要创建的最后一个活动图像。如何在使用雄辩orm时只让第一个孩子成为父母?

相册模式是:

class Album extends Model { 
    public function images() 
    { 
     return $this->hasMany('Images','album_id'); 
    } 

    public function scopeActive($query){ 
     return $query->where('is_active', 1); 
    } 
} 

我的图片型号是:

class Images extends Model { 

    public function scopeActive($query){ 
     return $query->where('is_active', 1); 
    } 

    public function album(){ 
     return $this->belongsTo('Album', 'album_id', 'id'); 
    } 

} 

到目前为止,我想出了以下内容:

$albums = Album::with(['images' => function($query){ 
      $query->orderBy('created_at', 'desc'); 
      $query->first(); 
     }]) 
     ->whereHas('images', function ($query) { 
      $query->active(); 
     }) 
     ->active() 
     ->get(); 

上述结果会给我以下阵列与图像只有一个相册:

Array 
(
[0] => Array 
    (
     [id] => 2 
     [name] => Test Gallery 
     [slug] => test-gallery 
     [description] => this is test gallery 
     [cover_image] => 
     [is_active] => 1 
     [created_by] => 2 
     [updated_by] => 2 
     [deleted_at] => 
     [images] => Array 
      (
      ) 

    ) 

[1] => Array 
    (
     [id] => 3 
     [name] => My Gallery 2 
     [slug] => my-gallery-2 
     [description] => Hello, this is my second gallery. 
     [cover_image] => 
     [is_active] => 1 
     [created_by] => 2 
     [updated_by] => 
     [deleted_at] => 
     [images] => Array 
      (
       [0] => Array 
        (
         [id] => 9 
         [album_id] => 3 
         [image] => gallery_xfWjm0JuzZ.jpg 
         [description] => 
         [is_active] => 1 
         [created_by] => 2 
         [updated_by] => 
         [deleted_at] => 
        ) 

      ) 

    ) 

) 

任何人都可以帮助我实现我想要做的。

+0

什么结果做的所有专辑你得到你当前的查询? – Jerodev

+0

请再次看到问题,我添加了从我的查询中得到的数组结果。 – razn

你应该尝试这样的:

class Album extends Model 
{ 
    public function image() 
    { 
     return $this->images() 
      ->active() 
      ->orderBy('created_at', 'desc') 
      ->take(1) 
      ->first(); 
    } 

    public function images() 
    { 
     return $this->hasMany('Images','album_id'); 
    } 

    public function scopeActive($query){ 
     return $query->where('is_active', 1); 
    } 
} 

$albums = Album::active()->whereHas('images', function ($query) { 
    $query->active(); 
})->get(); 

foreach ($albums as $album) { 
    var_dump($album->image()); 
} 
+0

谢谢。你的解决方案为我工作 – razn

+0

这将工作,但这将执行'n + 1'查询。应该避免哪些。 – Jerodev

+0

是的,我注意到了。任何想法如何可以避免在这种情况下? – razn

所有你需要的是whereHas方法:

$albums = Album::whereHas('images', function ($query) { 
    $query->where('is_active', 1)->orderBy('created_at', 'desc'); 
})->get(); 

这将检索至少有一个活动图像

+0

但这不会检索所有专辑的第一张图像,是吗? – razn