插入: FriendsOfCake/Search
CakePHP: 3.1.4
我正在使用插件过滤带有表单的index.ctp视图数据。这个类似的问题:如何对关联的数据进行过滤是关于一个belongsTo关联。我的问题特别是关于关联的HABTM数据,其中关联表是通过joinTable而不是直接链接的。在这种情况下,无法在Model中正常进行以下设置:
->value('painting', [
field' => $this->Paintings->target()->aliasField('id')
)]
我的表设置如下:
这是主要设置:
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'
仅在“票证”视图中显示“绘画”表中的数据时,包含项才能正常工作。
但是在SQL查询的代码中,我可以看到,除了Paintings表之外,所有包含的表(Members,Appoinments)都已连接到该查询中,因此很明显它找不到列...而且我猜它不能真正地无论如何直接将其加入,因为它们仅通过joinTable连接。
我是CakePHP的新手,在这里我真的无法弄清楚自己在做什么错,因此希望有人可以帮我一点忙。
我必须在插件设置中使用其他语法吗?我必须以其他方式设置表格吗?或者,如何准确地告诉查询将habtm相关表合并到搜索中?
谢谢!
可用的搜索方法取决于主查询中可用的字段(hasMany
并且belongsToMany
正在单独的查询中检索关联)。
虽然您可以在控制器中手动将其加入,但使用callback
-或finder
-filter可能是更好的方法,但您可以在模型层中修改查询,并且可以轻松地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;
}
也可以看看
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句