CakePHP 1.3 关联

Posted

技术标签:

【中文标题】CakePHP 1.3 关联【英文标题】:CakePHP 1.3 associations 【发布时间】:2010-07-12 21:31:20 【问题描述】:

我已经开始使用 Cakephp (1.3) 编写一个项目,并且发现使用 CakePHP 查询样式返回结果很困难。

该项目是一个问题跟踪器。到目前为止,我只有以下表格 - 'users'、'projects' 和一个链接表 'projects_users',因为任何用户都可以与一个或多个项目相关联。还有一个链接到项目表的“状态”表。

我已经在模型中设置了关联。

我正在尝试为那些登录的人返回一个摘要页面,显示项目名称,项目状态由登录 user_id 过滤。如果我在 SQL 中执行此操作,那么我将执行以下操作。

SELECT
  `statuses`.name,
  `projects`.name
FROM
  `statuses`
  INNER JOIN `projects` ON (`statuses`.id = `projects`.status_id)
  INNER JOIN `projects_users` ON (`projects`.id = `projects_users`.project_id)
  INNER JOIN `users` ON (`projects_users`.user_id = `users`.id)
WHERE
  `users`.id = 1

$this->Project->find('all')) 返回所有项目、状态详情和用户详情。

    Array
    (
        [0] => Array
            (
                [Project] => Array
                    (
                        [id] => 1
                        [name] => Project 1
                        [status_id] => 2
                        [date_created] => 0000-00-00
                    )

                [Status] => Array
                    (
                        [id] => 2
                        [name] => Live
                    )
                [User] => Array
                    (
                        [0] => Array
                            (
                                [id] => 1
                                [username] => d
                                [password] => ********************************
                                [role] => master
                                [ProjectsUser] => Array
                                    (
                                        [id] => 1
                                        [project_id] => 1
                                        [user_id] => 1
                                    )
                            )
                    )
            )

Etc..

我也试过

$this->Project->find('all', array('conditions'=>array('User.id' => $this->Session->read('Auth.User.id'))))

返回错误:

“where 子句”中的未知列“User.id”

如果我尝试

$this->Project->User->find('all', array('conditions'=>array('User.id' => $this->Session->read('Auth.User.id'))))

它正确返回了与 user_id 关联的所有项目,但现在我不再返回 status 的值,只返回 id。

Array
(
    [0] => Array
        (
            [User] => Array
                (
                    [id] => 1
                    [username] => d
                    [password] => ********************************
                    [role] => master
                )

            [Project] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [name] => Project 1
                            [status_id] => 2
                            [date_created] => 0000-00-00
                            [ProjectsUser] => Array
                                (
                                    [id] => 1
                                    [project_id] => 1
                                    [user_id] => 1
                                )
                        )
                    [1] => Array
                        (
                            [id] => 3
                            [name] => Project 3
                            [status_id] => 1
                            [date_created] => 0000-00-00
                            [ProjectsUser] => Array
                                (
                                    [id] => 2
                                    [project_id] => 3
                                    [user_id] => 1
                                )
                        )
                )
        )
)

有没有一种方法可以轻松地返回“CakePHP”之后的内容?我确定我在这里遗漏了一些明显的东西。

【问题讨论】:

【参考方案1】:

返回错误 - 'where 子句'中的未知列 'User.id'

您的表名是users。复数。你传递给它的不是users

【讨论】:

好主意,但是 $this->Project->find('all', array('conditions'=>array('Users.id' => $this->Session->read( 'Auth.User.id')))) 仍然给出错误。我相信蛋糕需要“用户”而不是用户,因为我正在过滤单个用户。具有“用户”的另一个查询也有效?【参考方案2】:

你想要这样的东西:

$this->Project->User->find(
    'all',
    array(
        'conditions' => array(
            'User.id' => $this->Session->read('Auth.User.id')
        ),
        'contain' => array(
            'Project' => array(
                'Status'
            )
        )
    )
);

我可能把你们的关系搞错了,但这应该可以解决问题。你想要的是containablecontainable 是核心库,但不会加入。如果您真的想要加入,Google 可以为您找到一个可链接的行为。

【讨论】:

感谢代码示例。不幸的是,它返回的结果与我的第二个示例完全相同,即 status_id 而不是状态。为清楚起见,Projects 表具有 status_id 的 FK 那么你必须在你的关系中定义 'fields' => array('Status.id') 。您可以将上述内容扩展到 'Status' => array('fields' => array('Status.id', 'Status.name')) @peter,你能停止编辑我的帖子 ktx 我没有定义 'fields' => array('Status.id') ,但我认为这只是意味着默认情况下会返回所有字段。扩展“状态”没有任何区别。我已经检查并重新检查了我的模型,其他一切都按我的预期工作,但不是这个。 如果你没有定义字段或 'fields' => array() // 为空,它将拉取该关系上的所有字段。你有调试吗,是否有任何错误显示(抓住稻草)我想不出任何自动取款机。也许应该是 :: 'contain' => array( 'Project', 'Status' ) 尝试添加 'recursive' => 2 以便进一步深入。你可以在这里阅读更多信息:book.cakephp.org/view/1063/recursive

以上是关于CakePHP 1.3 关联的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp 1.3:如何迁移到我的文章标签 - 功能

CAKEPHP 1.2/1.3 中的前缀路由和插件

CakePHP 3:保存关联模型失败

CakePHP 1.3 - 保存不相关模型的事务

CakePHP 多模型关联

CakePHP 模型关联深层模型包含