如何使用CakePHP 3.1.0的FriendsOfCake搜索插件过滤关联数据

ifmq2ha2  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(130)

插件:FriendsOfCake\Search

CakePHP: 3.1.0

我目前正在index()方法上添加过滤Orders控制器的功能。我需要能够搜索Orders my的用户名下订单。每个订单都与Users模型相关联:

$this->belongsTo('Users', [
        'foreignKey' => 'user_id',
        'joinType' => 'INNER'
    ]);

当我在OrdersTable.php文件中构建我的searchConfiguration()方法时,我有以下内容:

->value('first_name', [
        'field' => $this->aliasField('Users.first_name')
    ])
    ->value('last_name', [
        'field' => $this->aliasField('Users.last_name')
    ])

Orders索引()方法

$query = $this->Orders->find('search', 
        $this->Orders->filterParams($this->request->query))->contain(['Users', 'PaymentMethods', 'Industries']
    )->order(['Orders.created' => 'DESC']);
    $this->set('orders', $this->paginate($query));

当我没有向查询传递任何参数时,这个方法可以正常加载,但是,当我尝试按first_namelast_name搜索时,我得到错误:
错误:SQLSTATE[42S22]:未找到列:1054“where子句”中的列“订单.用户.名字”未知
根据错误,它将Orders.追加到我试图搜索的字段中。从我可以告诉CakePHP有2个方法aliasField(),一个在\var\www\<project_name>\vendors\cakephp\cakephp\src\ORM\Query.php

public function aliasField($field, $alias = null)
{
    $namespaced = strpos($field, '.') !== false;
    $aliasedField = $field;

    if ($namespaced) {
        list($alias, $field) = explode('.', $field);
    }

    if (!$alias) {
        $alias = $this->repository()->alias();
    }

    $key = sprintf('%s__%s', $alias, $field);
    if (!$namespaced) {
        $aliasedField = $alias . '.' . $field;
    }

    return [$key => $aliasedField];
}

一个在\var\www\<project_name>\vendors\cakephp\cakephp\src\ORM\Table.php

public function aliasField($field)
{
    return $this->alias() . '.' . $field;
}

Query.php似乎允许您为字段指定$alias,但是Table.php不允许,所以我假设这就是这里使用的方法。
有谁能给予我如何筛选关联表中包含的数据吗?

mspsb9vt

mspsb9vt1#

如果已经提供了别名,那么就不要使用aliasField()

'field' => 'Users.first_name'

或在关联的Users表上使用aliasField()

'field' => $this->Users->target()->aliasField('first_name')

使用Query::aliasField()将是完全错误的,因为这将返回一个key => value数组以与Query::select()一起使用。

相关问题