首页 > 解决方案 > 在 Laravel 中重构合并查询

问题描述

我目前有 2 种方法可以双向执行搜索查询,然后将它们合并在一起以检索结果。

模型关系

public function linkedTo() {
    return $this->hasMany(Linked::class, 'team_id');
}

public function linkedFrom() {
    return $this->hasMany(Linked::class, 'linked_id');
}

询问

$linkedTo = $team->linkedTo()->with(['games' => function ($query) use ($search) {
    $query->where('title', 'like', "%$search%");
}])->get();

$linkedFrom = $team->linkedFrom()->with(['games' => function ($query) use ($search) {
    $query->where('title', 'like', "%$search%");
}])->get();

$links = $linkedTo->merge($linkedFrom);

为了从搜索结果中获得我需要的结果,我必须将它们合并在一起。

有没有一种更简洁的方法可以在一个查询中将它们连接在一起?

标签: mysqllaraveleloquent

解决方案


如果你想减少代码重复(但实际上不改变执行的内容),你可以这样做:

$filter = function ($query) use ($search) {
    $query->where('title', 'like', "%$search%");
};
$linkedTo = $team->linkedTo()->with(['games' => $filter ])->get();
$linkedFrom = $team->linkedFrom()->with(['games' => $filter ])->get();
$links = $linkedTo->merge($linkedFrom);

推荐阅读