我有两个表格标签和管理员,我的标签表如下所示:
我的管理员表格如下:
admin表中的标记字段是外键,它引用标记表中的ID。我想要做的是,使用特定的tag
提取管理表中的记录,现在管理表中的tag
引用id
中的tags
表。
所以我编写了以下查询以从admin表中检索具有特定标记的文章(例如Javascript
)。
public function showTagListing($tag) {
$tagId = DB::table('tags')->where('tag', $tag)->first();
$tagBlogList = DB::table('admin')->where('tag', $tagId->id )->orderBy('created_at' , 'desc')->get();
return view('pages.taglisting', compact('tagBlogList', $tagBlogList));
}
我想我已经在这里写了一些额外不需要的代码行来检索文章记录,我如何在一行中编写代码?我该如何优化这些代码?
答案 0 :(得分:1)
您可以添加一些技巧来通过依赖注入派生$tag
,并通过向您{{1}的primary key
方法添加一些逻辑,通过boot
以外的其他列来解析它}}
RouteServiceProvider
然后,您可以更改路线,以便它需要标记实例,无论Route::bind('tag', function ($value) {
if (is_int($value)) {
return App\Tag::findOrFail($value);
} else {
return App\Tag::where('tag', $value)->firstOrFail();
}
});
还是primary key integer
:
tag string
最后,更新您的函数以通过依赖注入解析标记:
//no idea how your route looks, but the important part is {tag}
Route::get('/show-tag-listing/{tag}', 'TagController@showTagListing');
现在您不再需要public function showTagListing(App\Tag $tag) {
,您可以稍后再使用$tagId =
。
您还可以确保在模型文件中建立了关系。由于管理员表上有$tag->id
,tag_id
会有很多管理员记录,而$tag
会admin
标记,如下所示:
haveOne
现在而不是:
// App\Tag class
public function admins()
{
return $this->hasMany('App\Admin');
}
// App\Admin class
public function tag()
{
return $this->belongsTo('App\Tag');
}
你可以这样做:
$tagBlogList = DB::table('admin')->where('tag', $tagId->id )->orderBy('created_at' , 'desc')->get();
答案 1 :(得分:1)
public function showTagListing($tag)
{
$tagBlogList = DB::table('admin')
->join('tags', 'tags.id', '=', 'admin.tag')
->where('tags.tag', $tag)
->latest()
->select('admin.*')
->get();
return view('pages.taglisting', compact('tagBlogList'));
}
如果你想采用雄辩的方式,那么你就可以做到这一点。用关系创建合适的模型。
public function showTagListing($tag)
{
$tagBlogList = Admin::whereHas('tags', function ($query) use($tag) {
$query->where('tag', $tag);
})
->latest()
->get();
return view('pages.taglisting', compact('tagBlogList'));
}