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'
)
)
)
);
我可能把你们的关系搞错了,但这应该可以解决问题。你想要的是containable
。 containable
是核心库,但不会加入。如果您真的想要加入,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 关联的主要内容,如果未能解决你的问题,请参考以下文章