Содержит поведение, условия и пустой массив - PullRequest
0 голосов
/ 09 декабря 2010

У меня следующий вопрос.

Часть кода:

        $result = $this->find('all', array(
            'contain' => array(
                'User' => array(
                    'fields' => 'id',
                    'conditions' => array(
                        'id' => $user_id
                    )
                )
            ),
            'fields' => 'url'
        ));

Эта функция find () вызвана в методе класса модели Project, и я хочу получить только проекты, в которых пользователь.id равно некоторому идентификатору пользователя, переданному моему методу.Пользователь HABTM Project и Project HABTM User.

Но после выполнения у меня есть следующее:


app/views/projects/index.ctp (line 1)

Array
(
    [0] => Array
        (
            [Project] => Array
                (
                    [url] => http://purpled.biz
                    [id] => 1
                )

            [User] => Array
                (
                    [0] => Array
                        (
                            [id] => 4
                            [ProjectsUser] => Array
                                (
                                    [user_id] => 4
                                    [project_id] => 1
                                    [projects_users_role_id] => 0
                                )

                        )

                )

        )

    [1] => Array
        (
            [Project] => Array
                (
                    [url] => http://google.com
                    [id] => 2
                )

            [User] => Array
                (
                    [0] => Array
                        (
                            [id] => 4
                            [ProjectsUser] => Array
                                (
                                    [user_id] => 4
                                    [project_id] => 2
                                    [projects_users_role_id] => 0
                                )

                        )

                )

        )

    [2] => Array
        (
            [Project] => Array
                (
                    [url] => http://test.com
                    [id] => 3
                )

            [User] => Array
                (
                )

        )

)

Как вы видите, есть последний массив с пустым [User] массивом, так как я могуисключить этот пустой массив (я имею в виду целый [2] массив) без использования блоков foreach / if?Я знаю, что использование bindModel также подойдет, но это не мой вопрос;) Итак, как?

1 Ответ

2 голосов
/ 09 декабря 2010

Помещение ваших условий в клавишу «содержать» отфильтрует результаты в этой конкретной модели.

Получение правильных данных Я уже отвечал на вопрос, очень похожий на этот здесь .Вам просто нужно заменить модели, упомянутые там, на ваши собственные модели.Если вам сложно понять ответ, сообщите нам.

Советы по структуре вашей текущей модели Я заметил, что в вашей модели ProjectsUser есть дополнительное поле "projects_users_role_id".Если ваша модель соединения сложна (это больше, чем просто id, model1_id, model2_id), то вам нужно представить ее самой моделью.Обычно это называется hasMany Through .

User hasMany ProjectsUser
Project hasMany ProjectsUser
ProjectsUserRole hasMany ProjectsUser

ProjectsUser belongsTo User
ProjectsUser belongsTo Project
ProjectsUser belongsTo ProjectsUserRole

Вы также можете переименовать «ProjectsUser» в нечто более приятное, например «ProjectMembership».

...