我试图从早上开始查询一个查询工作并且无法使其工作我有两个表摄影师和评论请看结构然后我会在底部提出问题:
评论表:
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();
问题是:我想要在评论表中找到至少有一个评论的所有摄影师,我也想只获取一个最新的评论,我可能有一个以上的评论给摄影师但是我只想要一个。
答案 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());
}