2013-04-02 4 views
0

Мне нужно найти эти строки из mysql, которые имеют уникальное поле test. Я пытался добавить virtualFields, чтобы получить кол test я сгруппированный по test полю и проверить, что тест должен быть равен 1.Виртуальные поля и использование HAVING в CakePHP

Ниже мой код ... это дает ошибку: Syntax error or access violation

public function index() 
{ 
    $this -> User -> virtualFields(array(
     'countTest' => "COUNT(User.test)" 
    )); 

    $users = $this -> User -> find('all', array(
     'conditions' => array('countTest' => 1), 
     'group' => 'User.test' 
    )); 

    pr($users); die; 
} 

Я нашел запрос MySql, который решает проблему: 'SELECT test, COUNT(*) as count FROM users GROUP BY test HAVING COUNT(*) = 1';

Вы можете преобразовать вышеуказанный запрос в формате CakePHP.

+1

Обратите внимание, что «virtualFields» не является * * метод, это свойство * * модели; Чтобы добавить виртуальное поле, используйте это: '$ this-> User-> virtualFields = array ('countTest' => 'COUNT (User.test)');'. Прочтите документацию здесь: [Виртуальные поля] (http://book.cakephp.org/2.0/ru/models/virtual-fields.html). Тем не менее, использовать его как условие «HAVING» немного сложно в CakePHP, оно должно быть добавлено к предложению «GROUP BY». см. ключ «группа» в ответе, предоставленном @icebreaker. – thaJeztah

ответ

2

Нечто подобное может привести вас к правильному решению

$this->User->find('all', array(
    'fields' => array('User.test', 'COUNT(User.test) AS User__test_count'), 
    'group' => array('User.test'), 
    // or even cake style SQL injection :) 
    // 'group' => array('User.test HAVING COUNT(*) = 1') 
)); 
+0

Большое спасибо вам! – user2185041

+0

Добро пожаловать. – icebreaker

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