CakePHP / Model使用的新功能

时间:2011-07-30 05:07:53

标签: cakephp

我有一个用户的表/模型,这些用户的某个子集在“角色”表中有一个条目。

创建可以访问角色表中有一个或多个条目/行的所有用户的模型的标准方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

欢迎来到蛋糕!

Cake最酷最强大的一个方面就是他们的capable ORM。一旦你弄清楚Cake的关联以及他们使用数据库的方式,就很难回到其他的东西。但是,我们需要做一些事情来确保在实现此目的之前使用实际的物理数据库模式。

所以,让我们使用一些“样本”数据。

users
 -------------------------------------------------------
|  id (PK)  |  role_id (FK)  |  username  |  password   |
 -------------------------------------------------------
|     1     |         1      |  cspray     |  ad64675   |
 -------------------------------------------------------

......依旧等等。

roles
 --------------------------------------------
|  id (PK)  |              name              |
 --------------------------------------------
|  1        |  Benevolent Dictator for Life  |
 --------------------------------------------

......依旧等等。

请注意表格的名称,usersroles以及字段名称,特别是idrole_id。那些很重要。 id通常是数据库中的auto incrementint字段。还有其他方法可以存储您的id密钥,但不要一次堆积太多。

现在,所有这一切,我们还没有回答你的问题!不要担心我们要做到这一点。但是,首先仔细检查数据库模式,并确保根据Cake convention命名这些表名和列。别担心我会等...

...

确定!现在打开favorite text editor并导航到install_dir/app/models/(其中install_dir是您安装框架的文件夹的名称)。创建新文件后,将其命名为user.php。在这个文件中,我们将使用一些看起来像这样的代码......

class User extends AppModel {

    public $belongsTo = array('Role');

}

而且,嗯,你有它!您现在可以通过Cake的“关联链”roles调用方法,从User类中查询$this->User->Role->find()表。您可以,也可能应该创建一个Role模型,就像您创建User一样,没有$belongsTo。在其中,您可以定义自己的方法与roles表进行交互,并将您需要的信息提供给User

我不想过多讨论Cake的ORM是如何工作的,主要是因为如果你读完Cake CookbookCake API,你会发现有丰富的知识可供选择。

尽情享受蛋糕!


因此,您的模型关联都已设置好,您已准备就绪。但是,你去哪儿了?好吧,你要查看Cake的Model behaviors,特别是最重要的核心行为之一Containable。这将使您完全按照自己的意愿行事。

让我们看看一些代码,我假设你已经熟悉了Model::find()方法。如果不是,我会快速检查一下,这样你就不会太困惑。虽然这很直截了当。

class User extends AppModel {

    // provides $this->User->Role
    public $belongsTo = array('Role');

    // gives access to various behaviors
    public $actsAs = array('Containable');

    // custom function
    public function get_users_with_roles() {

        return $this->User->find(
            'contain' => array(
                'Role' => array(     // tells ORM to query `roles` table
                    'Hour',         // <-- tells ORM to query `hours` table
                    'conditions' => array(
                       'Role.id' => '<> NULL'
                    )
                )
            ),
            'fields' => array(
                'User.username'
            )
        );

    }

}

这应该返回在id表中有条目的所有用户的用户名(可能还有他们的role_idroles)。请注意添加新属性以及Cake的ORM中“查询”的布局方式。我建议熟悉的一件事是多维关联数组,Cake使用了很多它们。