查询Laravel关系

时间:2015-05-12 09:38:28

标签: eloquent laravel-5 relationship

我试图从早上开始查询一个查询工作并且无法使其工作我有两个表摄影师和评论请看结构然后我会在底部提出问题:

评论表:

id int(10) unsigned -> primary key 
review text
user_id int(10) unsigned foreign key to users table
user_name varchar(64) 
photographer_id int(10) unsigned foreign key to photographers table 

摄影师表:

id int(10) unsigned -> primary key
name text
brand text
description text
photo text
logo text
featured varchar(255)

摄影师模特:

class Photographer extends Model
{

public function reviews()
{
    return $this->hasMany('\App\Review');
}
}

评论模特:

class Review extends Model
{
public function photographers()
{
    return $this->belongsTo('\App\Photographer');
}
}

我查询记录的逻辑

$response = Photographer::with(['reviews' => function($q)
{
    $q->selectRaw('max(id) as id, review, user_id, user_name, photographer_id');
        }])
        ->where('featured', '=', 'Yes')
        ->get();

问题是:我想要在评论表中找到至少有一个评论的所有摄影师,我也想只获取一个最新的评论,我可能有一个以上的评论给摄影师但是我只想要一个。

2 个答案:

答案 0 :(得分:1)

我会在你的Photogrpaher类中添加另一种关系方法:

public function latestReview()
{
    return $this->hasOne('App\Review')->latest();
}

然后你可以打电话:

Photographer::has('latestReview')->with('latestReview')->get();

注意:

  • 查询构建器上的latest()方法是orderBy('created_at', 'desc')的快捷方式。您可以通过传递参数 - ->latest('updated_at')
  • 来覆盖它使用的列
  • with方法在最新评论中加载。
  • has方法仅查询至少有一项具有指定关系的摄影师

看看Has Queries in Eloquent。如果您想进一步自定义has查询,whereHas方法将非常有用

如果您有兴趣

您可以将查询方法添加到关系方法的结果中。关系对象有一个查询构建器对象,它们传递任何不存在的方法,因此您可以将关系用作该关系的查询构建器。

在Eloquent ORM模型的关系方法中添加查询范围/参数的优点是它们是:

答案 1 :(得分:0)

您需要的是最好通过reviews关系的范围查询来完成。

将此添加到您的评价模型:

use Illuminate\Database\Query\Builder;
use Illuminate\Database\Eloquent\Model;

class Review extends Model {
    public function scopeLatest(Builder $query) {
        // note: you can use the timestamp date for the last edited review,
        // or use "id" instead. Both should work, but have different uses.
        return $query->orderBy("updated_at", "desc")->first();
    }
}

然后就这样查询:

$photographers = Photographer::has("reviews");
foreach ($photographers as $photographer) {
    var_dump($photographer->reviews()->latest());
}