如何优化具有外键的雄辩查询

时间:2017-06-04 18:26:01

标签: php mysql laravel eloquent

我有两个表格标签和管理员,我的标签表如下所示:

enter image description here

我的管理员表格如下:

enter image description here

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));
    }

我想我已经在这里写了一些额外不需要的代码行来检索文章记录,我如何在一行中编写代码?我该如何优化这些代码?

2 个答案:

答案 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->idtag_id会有很多管理员记录,而$tagadmin标记,如下所示:

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'));
}