【问题标题】:How to retrieve data from two tables?如何从两个表中检索数据?
【发布时间】:2013-04-27 10:25:28
【问题描述】:

我有两张桌子

posts 
------
post_id | user_id | post_title | post_content

users
--------
id | user_name | user_ . .. . . . and so on 

我需要获取包含用户数据的所有帖子 显示帖子作者等。

如何使用 CakePHP 查询来实现这一点?

【问题讨论】:

  • model 中定义关系并使用$this->Post->find('all');,这将为您提供所需的结果。
  • 是的!我只是询问了Model中的关系
  • 请尽量使用 CakePHP 约定,不要在字段名称前加前缀;例如将 user_name 重命名为 name。 CakePhp 已经使用模型别名作为前缀(例如User.name)来防止重复的字段名称。在此处阅读有关约定:Model and Database conventions不使用约定(尤其是(主)键字段)可能需要您在所有模型和关系中指定主键和外键字段,这会使事情变得更加困难

标签: php mysql cakephp


【解决方案1】:

在您的 UserModel 中定义:

var $hasMany = 'Post';

在您的 PostModel 中定义:

var $belongsTo = 'User';

然后你可以得到一些用户的所有帖子:

$this->User->findAllById($id, array('recursive' => 2));

或者您可以获取与相应用户相关的所有帖子:

$this->Post->find("all", array('recursive' => 2));

编辑: 您的帖子 id 列名为 post_id,因此您必须在 PostModel 中定义主键,因为 CakePHP 约定主键应命名为 id:

public $primaryKey = 'post_id';

【讨论】:

  • 但是如何将模型 post.user_id 中的 foreign_key 与 user.id 链接
  • @Alsemany 如果您的数据库不是根据 CakePHP 约定构建的,您只需要链接。 CakePHP 期望 表 Posts 有一个名为 user_id 的外键列,而且您似乎有。至少名称是正确的,但请确保您将 user_id 定义为外键。哦,我看到您的帖子 id 列是 post_id。也许这就是问题所在。再次检查我的答案。
  • hi :( 这是对外键进行 lnk 的正确方法 public $belongsTo = array('User' => array('className' => 'User', 'foreignKey' = > 'user_id' )); 这是在帖子模型中,谢谢
  • @Alsemany 您是否尝试定义主键而不是 public $primaryKey = 'post_id';?您的外键名称遵循 CakePHP 约定,所以我猜您不需要定义它。
【解决方案2】:
$this->Post->find('all',array('fields'=>array('User.*'),'conditions'=>array('Post.user_id=User.id')),
        joins' => array(
            array(
                'alias' => 'User',
                'table' => 'users',
                'type' => 'Inner',
                'conditions' => array('User.user_id' =>$id)
            )
        )
 ));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 2013-06-28
    • 2021-06-04
    • 2023-04-04
    • 2012-12-09
    • 2013-07-23
    • 2016-10-20
    相关资源
    最近更新 更多