我正在制作一个雄辩的查询来编辑新闻通讯,但我已经碰壁了。
我要做的是创建一个用户可以选择出版物和日期的UI。理想情况下,它会编制该出版物类别(故事> 0)和属于它的故事的列表。
以下是我的3个型号:
故事
public function user()
{
return $this->belongsTo('User', 'user_id');
}
public function publication()
{
return $this->belongsTo('Workbench\Dailies\Publication', 'publication_id');
}
public function category()
{
return $this->belongsTo('Workbench\Dailies\Category', 'category_id');
}
公开
public function story()
{
return $this->belongsTo('Workbench\Dailies\Story');
}
public function stories()
{
return $this->hasMany('Workbench\Dailies\Story', 'publication_id');
}
public function category()
{
return $this->belongsTo('Workbench\Dailies\Category', 'publication_id');
}
类别
public function story()
{
return $this->belongsTo('Workbench\Dailies\Story', 'category_id');
}
public function publications()
{
return $this->belongsTo('Workbench\Dailies\Publication', 'publication_id');
}
public function stories()
{
return $this->hasMany('Workbench\Dailies\Story', 'category_id');
}
以下是我的表格外观:
故事
公开
分类
以下是我目前在存储库中的内容。
public function compileStories($input)
{
return Category::has('stories', '>', 0)
->with('publications')
->whereHas('stories', function ($query) use ($input)
{
$query->where('publish_date', $input['publish_date']);
$query->where('publication_id', $input['publication_id']);
});
}
我是朝着正确的方向前进,还是有办法改进上面的代码?它目前没有按预期运行。
答案 0 :(得分:1)
我在这里看到的一些事情可能会帮助你理顺。
首先 - 有些模型在不了解您的整个应用程序的情况下会有奇怪的关系。 Story模型不需要发布关系,因为它可以通过类别关系检索,除非您需要它。分类模型不再需要故事和故事关系,除非我不知道的故事还有更多内容。在您的示例中,您应该只需要hasMany关系。出版物模型只需要类别关系。
现在,在对模型进行一些清理之后,让我们看看你的查询。使用类别模型返回结果似乎完全适合您想要的结果。但是,您可以查看出版物,而无需深入了解您的故事。我没有测试它,但你可能不需要使用$ input行,因为$ input在更大的范围内。您还缺少对whereHas子句中where语句的条件检查。查询应该能够简化如下:
Category::where('publication_id', '=', $input['publication_id'])
->whereHas('stories', function($query)
{
$query->where('publish_date', '=', $input['publish_date']);
})
->get()