Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] app/Repository/IRepository.php中findByField和findByFilter方法无效 #546

Open
cxszn opened this issue Feb 17, 2025 · 3 comments
Open
Assignees
Labels

Comments

@cxszn
Copy link

cxszn commented Feb 17, 2025

执行命令并粘贴以下结果。

Command: uname -a && php -v && composer info | grep mine && php --ri swoole

# Paste the result here.

bug描述:

public function findByField(mixed $id, string $column): mixed
{
    return $this->getQuery()->whereKey($id)->value($column);
}


public function findByFilter(array $params): mixed
{
    return $this->perQuery($this->getQuery($params), $params)->first();
}

重现步骤:

findByFilter(['type' => 'sdgds']);例如这个随便输入数据库的字段也会调用显示数据库排序靠前的第一条数据
这个逻辑和方法名不一样findByField

拉取的版本为20250217最新测试发现

@cxszn cxszn added the bug label Feb 17, 2025
Copy link

dosubot bot commented Feb 17, 2025

Hey @cxszn! I'm here to help you with your software development issues. Let's work together to solve the bug you've encountered.

findByFieldfindByFilter 方法的行为可能不符合预期的原因如下:

  1. findByField 方法:

    • 该方法使用 whereKey 来查找记录的主键,并返回指定列的值。确保传递的 $id 是主键值,并且 $column 是存在的列名。
  2. findByFilter 方法:

    • 该方法使用 perQuery 方法来修改查询,然后返回第一个匹配的记录。perQuery 方法会调用 handleSearch,根据传入的参数应用搜索条件。
    • 如果传入的参数没有匹配的条件,可能会导致返回数据库中排序靠前的第一条记录。确保 handleSearch 方法中有适当的条件来处理传入的参数。

handleSearch 方法的实现如下,确保传入的参数在此方法中有对应的条件:

public function handleSearch(Builder $query, array $params): Builder
{
    return $query
        ->when(Arr::get($params, 'username'), static function (Builder $query, $username) {
            $query->where('username', $username);
        })
        ->when(Arr::get($params, 'method'), static function (Builder $query, $method) {
            $query->where('method', $method);
        })
        ->when(Arr::get($params, 'router'), static function (Builder $query, $router) {
            $query->where('router', $router);
        })
        ->when(Arr::get($params, 'service_name'), static function (Builder $query, $service_name) {
            $query->where('service_name', $service_name);
        })
        ->when(Arr::get($params, 'ip'), static function (Builder $query, $ip) {
            $query->where('ip', $ip);
        })
        ->when(Arr::get($params, 'created_at'), static function (Builder $query, $created_at) {
            $query->whereBetween('created_at', $created_at);
        })
        ->when(Arr::get($params, 'updated_at'), static function (Builder $query, $updated_at) {
            $query->whereBetween('updated_at', $updated_at);
        });
}

确保 findByFilter 方法传入的参数在 handleSearch 中有对应的条件处理,以避免返回不符合预期的结果[1][2].

To continue talking to Dosu, mention @dosu.


Help Dosu learn! Give it feedback: Great Response | Irrelevant Answer | Incorrect Sources | Too Verbose | Hallucination | Bug Report | Other

@zds-s
Copy link
Member

zds-s commented Feb 17, 2025

Repository->handlerSearch 有处理 type 吗?
如果没有就等于 orm::first() 效果 了

@zds-s
Copy link
Member

zds-s commented Feb 17, 2025

findByFilter 语义是有点不太对,按照你的理解应该是等同于 model::where($where)->first

但是实际则是需要在 handleSearch 方法里面对 type 进行一次处理才行

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants