我正在使用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);
谢谢,非常感谢。
答案 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
);
}