CakePHP 3-在自定义查找器中使用…选择

CakePHP 3-在自定义查找器中使用…选择,php,mysql,cakephp,cakephp-3.x,Php,Mysql,Cakephp,Cakephp 3.x,我写了一个方法如下: public function findSubstanceListNotifications(Query $query, array $options) { $date_start = $options['date_start']; $date_end = $options['date_end']; $list_id = $options['list_id']; $list_substances = TableRegistry::getTa

我写了一个方法如下:

public function findSubstanceListNotifications(Query $query, array $options)
{
    $date_start = $options['date_start'];
    $date_end = $options['date_end'];
    $list_id = $options['list_id'];

    $list_substances = TableRegistry::getTableLocator()->get('TblListsSubstances')->find()
            ->select('substance_id')->where(['list_id IN' => $list_id])->enableHydration(false);

    if ($list_substances->isEmpty()) {
        return false;
    }

    $query = $this->find()
            ->select(['RevisionSubstances.date', 'RevisionSubstances.comment', 'RevisionSubstances.id', 'Substances.name', 'Substances.app_id'])
            ->where(['substance_id IN' => array_column($list_substances->toArray(), 'substance_id')]);

    $query->where(['RevisionSubstances.date >=' => $date_start, 'RevisionSubstances.date <=' => $date_end]);

    $query->contain('Substances');
    $query->order(['RevisionSubstances.date' => 'DESC', 'Substances.app_id' => 'ASC']);

    $query->enableHydration(false);

    if ($query->isEmpty()) {
        return false;
    }

    return $query;
}
上面的
IN()
条件使用与登录用户相关的ID。然而,这个数组最多只有20个键,所以我认为这里不会有任何类似的内存问题。但是我也需要知道如何在运行子查询时访问这些

CakePHP版本是3.7


我在中阅读了有关使用
newExpr()
的内容,但看不出此时如何以一种可行的方式插入
SELECT
语句。

几千个键可能太多了。我不确定您对子查询的关注点是什么,但它应该可以正常工作,只需将
$list\u substances
作为条件传递,如:

->其中(['substance\u id IN'=>$list\u substances])

几千个键很容易太多。我不确定您对子查询的关注点是什么,但它应该可以正常工作,只需将
$list\u substances
作为条件传递,如:

->其中(['substance\u id IN'=>$list\u substances])
SELECT substance_id FROM tbl_lists_substances WHERE list_id IN(1,2,3,4);