#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