如何使用 FriendsOfCake Search for CakePHP 3 过滤关联的 HABTM 数据
How to filter associated HABTM data with FriendsOfCake Search for CakePHP 3
插件:FriendsOfCake/Search
CakePHP: 3.1.4
我正在使用该插件通过表单过滤我的 index.ctp 视图数据。
这个类似的问题:
是关于 belongsTo 关联。我的问题特别是关于关联的 HABTM 数据,其中我的关联 table 通过 joinTable 而不是直接链接。在这种情况下,模型中的正常设置如下所示不起作用:
->value('painting', [
field' => $this->Paintings->target()->aliasField('id')
)]
我的 table 设置如下:
- 门票belongsToMany绘画
- 画作belongsToMany门票
- 与joinTabletickets_paintings
这是主要设置:
class TicketsTable extends Table
{
public function initialize(array $config)
{
...
$this->belongsToMany('Paintings', [
'foreignKey' => 'ticket_id',
'targetForeignKey' => 'painting_id',
'joinTable' => 'tickets_paintings'
]);
}
public function searchConfiguration()
{
$search = new Manager($this);
$search->value('status', [
'field' => $this->aliasField('active'),
])->like('member_name', [
'field' => $this->Members->target()->aliasField('surname'),
'filterEmpty' => true
])->value('painting', [
'field' => $this->Paintings->target()->aliasField('id'), // not working
]);
return $search;
}
class TicketsController extends AppController
{
public function index()
{
$query = $this->Tickets
->find('search',
$this->Tickets->filterParams($this->request->query))
->contain(['Members', 'Paintings', 'Appointments']);
...
}
其他一切正常,当我过滤等时,参数被添加到 URL,所以我只输入了必须出错的部分。
过滤后出现错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Paintings.id' in 'where clause'
当仅在票证视图中显示绘画 table 中的数据时,contain 工作正常。
但是在 SQL 查询的代码中我可以看到,所有包含的 tables(成员,约会)都加入了查询 except Paintings table,所以很明显它找不到列...而且我猜它不能直接连接它,因为它们只是通过 joinTable 连接。
我是 CakePHP 的新手,我真的不知道我做错了什么,所以希望有人能帮助我。
我必须在插件设置中使用不同的语法吗?我必须以不同的方式设置我的表吗?或者我怎样才能告诉查询在搜索中合并与 habtm 相关的 table?
谢谢!
可用的搜索方法取决于主查询中可用的字段(hasMany
和 belongsToMany
关联在单独的查询中检索)。
虽然您可以在控制器中手动加入它,但使用 callback
- 或 finder
- 过滤器可能是更好的方法,这样您就可以在模型层中修改查询,您可以轻松利用 Query::matching()
按关联数据进行过滤。
这是一个(未经测试的)示例,应该会给您提示:
use Cake\ORM\Query;
use Search\Type\Callback; // This changed in master recently
// now it's Search\Model\Filter\Callback
// ...
public function searchConfiguration()
{
$search = new Manager($this);
$search
// ...
->callback('painting', [
'callback' => function (Query $query, array $args, Callback $type) {
return $query
->distinct($this->aliasField('id'))
->matching('Paintings', function (Query $query) use ($args) {
return $query
->where([
$this->Paintings->target()->aliasField('id') => $args['painting']
]);
});
}
]);
return $search;
}
另见
插件:FriendsOfCake/Search
CakePHP: 3.1.4
我正在使用该插件通过表单过滤我的 index.ctp 视图数据。
这个类似的问题:
->value('painting', [
field' => $this->Paintings->target()->aliasField('id')
)]
我的 table 设置如下:
- 门票belongsToMany绘画
- 画作belongsToMany门票
- 与joinTabletickets_paintings
这是主要设置:
class TicketsTable extends Table
{
public function initialize(array $config)
{
...
$this->belongsToMany('Paintings', [
'foreignKey' => 'ticket_id',
'targetForeignKey' => 'painting_id',
'joinTable' => 'tickets_paintings'
]);
}
public function searchConfiguration()
{
$search = new Manager($this);
$search->value('status', [
'field' => $this->aliasField('active'),
])->like('member_name', [
'field' => $this->Members->target()->aliasField('surname'),
'filterEmpty' => true
])->value('painting', [
'field' => $this->Paintings->target()->aliasField('id'), // not working
]);
return $search;
}
class TicketsController extends AppController
{
public function index()
{
$query = $this->Tickets
->find('search',
$this->Tickets->filterParams($this->request->query))
->contain(['Members', 'Paintings', 'Appointments']);
...
}
其他一切正常,当我过滤等时,参数被添加到 URL,所以我只输入了必须出错的部分。
过滤后出现错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Paintings.id' in 'where clause'
当仅在票证视图中显示绘画 table 中的数据时,contain 工作正常。
但是在 SQL 查询的代码中我可以看到,所有包含的 tables(成员,约会)都加入了查询 except Paintings table,所以很明显它找不到列...而且我猜它不能直接连接它,因为它们只是通过 joinTable 连接。
我是 CakePHP 的新手,我真的不知道我做错了什么,所以希望有人能帮助我。
我必须在插件设置中使用不同的语法吗?我必须以不同的方式设置我的表吗?或者我怎样才能告诉查询在搜索中合并与 habtm 相关的 table?
谢谢!
可用的搜索方法取决于主查询中可用的字段(hasMany
和 belongsToMany
关联在单独的查询中检索)。
虽然您可以在控制器中手动加入它,但使用 callback
- 或 finder
- 过滤器可能是更好的方法,这样您就可以在模型层中修改查询,您可以轻松利用 Query::matching()
按关联数据进行过滤。
这是一个(未经测试的)示例,应该会给您提示:
use Cake\ORM\Query;
use Search\Type\Callback; // This changed in master recently
// now it's Search\Model\Filter\Callback
// ...
public function searchConfiguration()
{
$search = new Manager($this);
$search
// ...
->callback('painting', [
'callback' => function (Query $query, array $args, Callback $type) {
return $query
->distinct($this->aliasField('id'))
->matching('Paintings', function (Query $query) use ($args) {
return $query
->where([
$this->Paintings->target()->aliasField('id') => $args['painting']
]);
});
}
]);
return $search;
}
另见