1

我是 Laravel Scout 的快乐用户。

现在我想扩展我的搜索:

        $data
            = new UserOverviewResourceCollection(User::search($searchphrase)
            ->currentStatus('active')->orderBy('lastname', 'asc')
            ->orderBy('firstname', 'asc')
            ->paginate(config('pagination.length')));

currentStatus 来自https://github.com/spatie/laravel-model-status

现在我收到回复,不支持 currentStatus。我认为在从侦察员返回后过滤 User::search 的结果可能是个好主意?

另一个想法:我想添加更复杂的 where 子句:

->where([
                [
                    'starts_on',
                    '<',
                    Carbon::now()->toDateTimeString(),
                ],
                [
                    'ends_on',
                    '>',
                    Carbon::now()->toDateTimeString(),
                ],
            ])

也许你有更好的主意?

4

4 回答 4

0

重写它,因为这应该有效。

 $data
            = new UserOverviewResourceCollection(User::search($searchphrase)
            ->where('starts_on','<',now())
            ->orderBy('lastname', 'asc')
            ->orderBy('firstname', 'asc')
            ->paginate(config('pagination.length')));

请注意,这now()只是一个返回当前时刻 Carbon 实例的全局辅助函数。它只是写得更短,没有其他使用它的理由。

如果你想要分组 where查询,你可以这样做:

 $data
            = new UserOverviewResourceCollection(User::search($searchphrase)
            ->where(function($q) {
               $q->where('starts_on','<',now())->where('ends_on','>',now())
            })
            ->orderBy('lastname', 'asc')
            ->orderBy('firstname', 'asc')
            ->paginate(config('pagination.length')));

然后您应该能够将其导出到UserOverviewResourceCollection本地范围,例如:

public function scopeActive($q) {
    return $q->where('starts_on','<',now())->where('ends_on','>',now())
}

然后你可以使用这样的东西:

 $data
            = new UserOverviewResourceCollection(User::search($searchphrase)
            ->active()
            ->orderBy('lastname', 'asc')
            ->orderBy('firstname', 'asc')

这是我脑子里写的,所以可能有错别字。

于 2019-01-28T11:00:34.873 回答
0

您可以扩展 Builder 并添加currentStatus方法以在 builder 中存储所需的状态。参见示例 https://github.com/matchish/laravel-scout-elasticsearch/issues/47#issuecomment-526287359

然后你需要实现你自己的引擎并在那里使用构建器构建查询。这是 ElasticSearch 引擎的示例 https://github.com/matchish/laravel-scout-elasticsearch/blob/06c90914668942b23ffaff7d58af5b9db1901fb1/src/Engines/ElasticSearchEngine.php#L135

于 2020-11-03T15:22:25.933 回答
0
 $data
        = new UserOverviewResourceCollection(User::search($searchphrase)
        ->currentStatus('active')->orderBy('lastname', 'asc')
        ->where(function($q){
            $query->where('starts_on', '<',Carbon::now()->toDateTimeString());
            $query->where('ends_on', '>',Carbon::now()->toDateTimeString());
         })
        ->orderBy('firstname', 'asc')
        ->paginate(config('pagination.length')));

试试这个代码。这将满足您的复杂条件

于 2019-01-28T11:03:48.670 回答
0

我真的也需要类似的功能,但恐怕目前不可能(Laravel 8)

根据文档;Laravel\Scout\Builder(这是search()返回的)只有一个真正基本的where方法实现,只能处理 2 个参数。以下是 scout 包中的代码:

/**
 * Add a constraint to the search query.
 *
 * @param  string  $field
 * @param  mixed  $value
 * @return $this
 */
public function where($field, $value)
{
    $this->wheres[$field] = $value;

    return $this;
}

请参阅https://laravel.com/docs/8.x/scout#where-clauses

search()所有常规的 eloquent builder 方法都放在后面也行不通,因为search它只是模型的静态函数。

希望这将在未来得到改善。

于 2020-10-28T17:18:30.303 回答