@exaller

SQL Many to Many выборка с AND условием в CakePHP

Дано:
table users:
id | name

table users_problems:
id | user_id | problem_id

table problems:
id | name

Нужно:
Сделать выборку юзеров у которых одновременно будет проблема с id = 1 & (и) id = 2. Если вы не знакомы с CakePHP, напишите хотя бы вариант SQL-запроса.

Мой вариант, но он работает как id = 1 || (или) id = 2:
$conditions = array(				
	'conditions' => array(
		'UsersProblem.problem_id' => array(1, 2)
		),
	'recursive' => -1,
	);
$conditions['joins'][] = array(
	'table' => 'users_problems',
	'alias' => 'UsersProblem',
	'type' => 'INNER',
	'conditions' => array(
		'User.id = UsersProblem.user_id',
	));


Такой вариант не работает:
$conditions = array(	
				'fields' => array(
					'User.id'
					),		
				'conditions' => array(
					'AND' => array(
						'UsersProblem.problem_id' => 38,
						'UsersProblem.problem_id' => 41,
						)					
 					),
				'recursive' => -1,
				'contain' => array(
					'Problem'
					)
				);

			$conditions['joins'][] = array(
				'table' => 'users_problems',
				'alias' => 'UsersProblem',
				'type' => 'INNER',
				'conditions' => array(
					'User.id = UsersProblem.user_id',
				));


Не работает потому, что берет от AND только последнее значение. Получается такой запрос:
SELECT `User`.`id` FROM `lawyers`.`users` AS `User` INNER JOIN `lawyers`.`users_problems` AS `UsersProblem` ON (`User`.`id` = `UsersProblem`.`user_id`) WHERE `UsersProblem`.`problem_id` = 41
  • Вопрос задан
  • 2760 просмотров
Пригласить эксперта
Ответы на вопрос 1
amr-dallin
@amr-dallin
Разработка на CakePHP
Здравствуй. Во-первых, ты не правильно настроил ассоциации. Во-вторых, не советую лезть в JOIN. Это сильно нагружает систему и в будущем можешь пожалеть, при работе с CakePHP. В общем, я написал скрипт. Он выполняет твои требования. Если тебе нужны правильные ассоциации или есть другие вопросы, то пиши в скайп amr.dallin.
public function index2()
  {
    $users = $this->User->find('all', array(
      'conditions' => array(
        'User.id' => $this->User->ProblemsUser->find('list', array(
          'conditions' => array(
            'AND' => array('ProblemsUser.problem_id' => 1, 'ProblemsUser.problem_id' => 2)
          ),
          'fields' => array('user_id')
        ))
      )
    ));
    
    pr($users);
    exit;
  }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы