我希望能够编写一个有说服力的查询,我可以传递给这个模型函数,只返回在$publishDate上发布故事的类别。
如-这是我想要的,但我得到以下错误'调用未定义的方法照亮'数据库'查询'Builder::stories()'
In my controller:
Category::orderBy('id', 'ASC')->stories($publishDate)->get();
在我的模型中:
public function stories($publishDate)
{
return $this->hasMany('Workbench'Dailies'Story', 'category_id')
->orderBy('story_title', 'ASC')
->where('publish_date', $publishDate);
}
我相信这是很简单的事情,但我不能完全理解它。
relation:
public function stories()
{
return $this->hasMany('Workbench'Dailies'Story', 'category_id');
}
然后// $publishedAt is some date you want
Category::whereHas('stories', function($query) use ($publishedAt) {
$query->where('published_at', '=', $publishedAt)->orderBy('story_title','asc');
})->orderBy('id','asc')->get();
我还没有找到任何类似的方法来做到这一点。我发现的方法类似于(在你的语境中):
Category::join('stories', 'categories.id', '=', 'stories.category_id')->where('stories.publish_date', '=', $publishDate)->orderBy('id', 'ASC')->get();
虽然,我更喜欢使用DB::select
和DB::raw
来选择筛选过的id,然后使用ORM我做Category::whereIn('id', <returned IDs>)->get()
(在您的上下文中)。
$sql = 'SELECT c.ID FROM categories c LEFT/INNER JOIN stories s ON (c.id = s.category_id) WHERE s.publish_date = ?';
$ids = DB::select(DB::raw($sql), array($publishDate));
// you can now iterate with array_walk, foreach, for, etc. the args to extract IDs from object rows
for($i = 0; $i < count($ids); $i++)
$ids[$i] = (int) $ids[$i]->id;
$cats = Category::whereIn('id', $ids)->orderBy('id', 'ASC')->get();
坏的是这部分没有很好地记录。我很惊讶,因为其他orm允许这样的关系查询。