如何使用 CakePHP 3.1.0 的 FriendsOfCake 搜索插件过滤关联数据
How to Filter Associated Data using FriendsOfCake Search plugin for CakePHP 3.1.0
插件:FriendsOfCake\Search
CakePHP: 3.1.0
我目前正在添加在 index()
方法上过滤我的订单控制器的功能。我需要能够根据下订单的用户名搜索订单。每个订单都与 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')
])
订单 index() 方法
$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_name
或 last_name
进行搜索时,我收到错误:
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Orders.Users.first_name' in 'where clause'
根据错误,它正在附加订单。到我要搜索的字段。据我所知 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 不允许,因此我假设这就是此处使用的方法。
任何人都可以指导我如何过滤关联 table 中包含的数据吗?
当您已经提供了别名时,要么不要使用 aliasField()
'field' => 'Users.first_name'
或在关联的 Users
table
上使用 aliasField()
'field' => $this->Users->target()->aliasField('first_name')
使用 Query::aliasField()
是完全错误的,因为这将 return 一个 key => value
数组用于 Query::select()
.
插件:FriendsOfCake\Search
CakePHP: 3.1.0
我目前正在添加在 index()
方法上过滤我的订单控制器的功能。我需要能够根据下订单的用户名搜索订单。每个订单都与 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')
])
订单 index() 方法
$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_name
或 last_name
进行搜索时,我收到错误:
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Orders.Users.first_name' in 'where clause'
根据错误,它正在附加订单。到我要搜索的字段。据我所知 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 不允许,因此我假设这就是此处使用的方法。
任何人都可以指导我如何过滤关联 table 中包含的数据吗?
当您已经提供了别名时,要么不要使用 aliasField()
'field' => 'Users.first_name'
或在关联的 Users
table
aliasField()
'field' => $this->Users->target()->aliasField('first_name')
使用 Query::aliasField()
是完全错误的,因为这将 return 一个 key => value
数组用于 Query::select()
.