2013-04-05 3 views
0

Я использую cakephp 2.3.0. Резюме. В моем контроллере у меня есть запрос, где он возвращает одно или несколько значений id. Затем я хочу использовать эти значения id в следующем запросе с ключевым словом SQL IN. Я знаю концептуально то, что хочу достичь. Я думаю, что делаю это правильно в CakePHP, но я могу ошибаться. Я просто не уверен, что часть кодирования будет динамически строить мой раздел IN.Динамическое построение предложения SQL Where с ключевым словом 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 не всегда могут быть значениями, потому что это зависит от того, что находится в базе данных. Я думаю, мне нужно пройти через массив и создать список моих идентификаторов. Я все еще несколько новичок в CakePHP, и я предполагаю, что это простой ответ для опытных людей.

И, да, я действительно хочу выполнить операцию deleteAll, основанную на моем случае использования.

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

спасибо, много оценено.

ответ

-1

Вам не нужно использовать $this->set(), если вам не нужны эти идентификаторы пользователя внутри вашего вида; 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 
    ); 
} 
+0

Это сделало трюк. Спасибо за помощь! – Kevin

+0

Рад, что я мог бы помочь! – thaJeztah

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')); 

 Смежные вопросы

  • Нет связанных вопросов^_^