Поиск данных с использованием связанного поля в CakePHP 2.4

#php #sql #cakephp #cakephp-2.4

#php #sql #cakephp #cakephp-2.4

Вопрос:

Я пытаюсь получить список пользователей в моем приложении CakePHP 2.4, которые внесли свой вклад в определенный проект (например, «категория»). Мои данные связаны следующим образом:

В проекте много сообщений

Пользователь имеет много сообщений

Сообщение принадлежит проекту и пользователю.

Я пытаюсь выполнить поиск в моем view методе проектов, чтобы получить список участников:

     $this->loadModel('User');
    $this->loadModel('Post');
    $this->set('contributors', $this->Project->Post->User->find('list', array(
        'conditions' => array('Post.project_id' => $id)
    )));
  

В идеале это должно дать мне список пользователей, которые создали сообщения с идентификатором project_id , равным $id. Однако я получаю сообщение об ошибке: Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Post.project_id' in 'where clause' .

Очевидно, что ORM не понимает смысла моего кода: он не знает, что, черт возьми, я имею в виду project_id . Возможно ли получить список пользователей путем поиска поля в связанной модели? Или это выходит за рамки возможностей объектной системы CakePHP?

Это приближение к тому, что я пытаюсь сделать в SQL. Я все еще не хочу использовать простой SQL, потому что все источники говорят мне, что это гнилая идея. Как я могу создать аналогичный запрос в Cake find?

 SELECT 
    users.* 
FROM 
    users 
WHERE 
    EXISTS (
        SELECT 
            * 
        FROM 
            posts
        WHERE 
            users.id = posts.user_id 
            AND 
            posts.project_id = " . $id . "
    )
  

Ответ №1:

Я нашел решение с использованием Cake, которое делает трюк: в этом коде успешно перечислены все Users , кто создал Posts , у которых есть то, что project_id я ищу.

 $contributors = array(
        'joins' => array(
            array(
                'table' => 'posts',
                'alias' => 'Post',
                'type' => 'inner',

                'conditions' => array(
                    'User.id = Post.user_id',
                    'Post.project_id' => $id,
                ),
            ),
        ),
        'fields' => array('User.*'),
        'group' => array('User.id'),
        'contain' => array()
    );

    $this->set('contributors', $this->User->find('all', $contributors));
  

Ответ №2:

 $user=$this->Post->find('all', array(
        'conditions' => array('Post.project_id' => $id)));

$this->set('contributors', 'user');
  

Затем вы можете использовать debug($user); exit; для просмотра результата, который вы получите

Комментарии:

1. Это дает список записей, которые принадлежат этому проекту. Я пытаюсь составить список пользователей, которые создали записи, принадлежащие проекту.

2. Ваш ответ не отвечает на вопрос. Не могли бы вы обновить или удалить его?

3. Пожалуйста, отредактируйте свой ответ в соответствии с тем, что запрашивает OP