使用IN关键字动态构建SQL Where子句

时间:2013-04-05 21:31:07

标签: cakephp cakephp-2.3

我正在使用cakephp 2.3.0。摘要 - 在我的控制器中,我有一个查询,它返回一个或多个id值。然后,我想在下一个查询中使用这些id值,使用SQL IN关键字。我从概念上知道自己想要完成什么。我想我在CakePHP中这样做是正确的,但我可能错了。我只是不确定动态构建我的IN子句的编码片。

以下是我的控制器的代码片段:

$this->set('userIDs', $this->Activity->ActivitiesOfInterest->find('all',
               array (
                    'conditions' => array ('ActivitiesOfInterest.activities_id' => $id),
                    'fields' => array ('ActivitiesOfInterest.user_id'))));

上面的代码很好,因为我得到了我期望的值。在下面的代码中,我已经硬编码了这个数组,数组(3,4),它等同于SQL IN关键字。值3,4将存储在userIDs数组中。但是,这是我不确定如何从上面的代码中的数组动态构建3和4的值的地方。当然,3和4可能并不总是值,因为它只取决于数据库中的内容。我想我需要循环遍历数组并建立我的id列表。我对CakePHP还有点新鲜,我猜这对经验丰富的人来说很简单。

而且,是的,我确实想根据我的用例执行deleteAll操作。

$this->Activity->ActivitiesOfInterest->deleteAll(
                    array('ActivitiesOfInterest.user_id' => array(3, 4)), false);

谢谢,非常感谢。

2 个答案:

答案 0 :(得分:0)

您也可以使用子查询进行deleteALL查询。

$conditionsSubQuery['ActivitiesOfInterest.activities_id'] = $id;
$db = $this->Financial->getDataSource();
        $subQuery = $db->buildStatement(
                array(
            'fields' => array('ActivitiesOfInterest.user_id'),
            'table' => $db->fullTableName($this->Activity->ActivitiesOfInterest),
            'alias' => 'ActivitiesOfInterest',
            'offset' => null,
            'joins' => array(),
            'conditions' => $conditionsSubQuery,
            'order' => null,
            'group' => null
                ),$this->Activity->ActivitiesOfInterest
        );
        $subQuery = ' ActivitiesOfInterest.user_id IN (' . $subQuery . ')' ;
        $subQueryExpression = $db->expression($subQuery);

        $conditions[] = $subQueryExpression;
        $result = $this->Activity->ActivitiesOfInterest->deleteAll(compact('conditions'));

答案 1 :(得分:-1)

您不需要使用$this->set(),除非您在视图中需要这些用户ID; Hash::extract()在这里可能会有所帮助。

// Find the user-ids
$result = $this->Activity->ActivitiesOfInterest->find('all', array (
    'conditions' => array (
        'ActivitiesOfInterest.activities_id' => $id
    ),
    'fields' => array (
        'ActivitiesOfInterest.user_id'
    )
));

if ($result) {
    // 'extract' just the user-ids from the results
    $userIds = Hash::extract($result, '{n}.ActivitiesOfInterest.user_id');

    $this->Activity->ActivitiesOfInterest->deleteAll(
        array(
            'ActivitiesOfInterest.user_id' => $userIds
        ),
        false
    );
}