0

我正在使用 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'))));

上面的代码很好,因为我得到了我期望的一个或多个值。在下面的代码中,我对这部分进行了硬编码,array(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);

谢谢,非常感谢。

4

2 回答 2

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'));
于 2013-04-06T05:04:39.537 回答
-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
    );
}
于 2013-04-05T21:52:52.710 回答