在CakePhp中跨三个表编写Model-> find()的正确方法是什么?

时间:2009-05-25 09:50:02

标签: cakephp

任何人都可以告诉我从数据库中做什么的最佳方法是

Table 1
-id
-data
-foreign_key_id_table2

Table 2
-id
-data
-foreign_key_id_table3

Table 3
-id
-data

我需要选择表格1的所有项目,这些项目链接到给定表格3条目的表2中的所有项目

之类的东西
select table1.data from table1 where table1.foreign_key_id_table2 in (select table2.id from table2 where table2.foreign_key_id_table3 = X)

但我需要用cakephp做到这一点,因为我是新手,我无法弄清楚如何

请帮助:)

2 个答案:

答案 0 :(得分:4)

好的,我会尝试帮助“教一个人如何捕鱼”。

Cake模型代表数据库表。每个模型都可以定义associations,例如belongsTo,hasMany,hasOne等。当您定义关联时,蛋糕会识别它并获取您需要的所有相关数据。

例如,假设你有一个模型Post和一个模型Comment。如果你在它们之间建立了一个关联(Post-hasMany-Comment和Comment-belongsTo-Post),那么每次你做post-> find()或Comment-> find()时,蛋糕都会起作用。 p>

那是什么意思?如果您这样做:

$ data = $ this->帖子> findByTitle('你的帖子标题');

$ data变量不仅包含Post数据,还包含所有相关注释。您可以通过致电debug($data);

随时查看其中的内容

可以使用recursive属性/参数或使用内置的Containable行为来设置相关数据的“深度”蛋糕级别。

定义模型之间的关联(回答你对Rob的回答的评论)的另一个好处是你不需要将所有模型都放在$ uses var中。事实上,这是错误的做法

信不信由你,但是一旦你正确地定义了你的关联,这将有效:

class PostsController extends AppController
{
    // not really needed, cake detects it automagically
    var $uses = array('Post');

    function index()
    {
        $comments = $this->Post->Comment->find('all');
    }
}
很好,不是吗?

在你的情况下,它会是这样的:

$this->Table1->find
    (
        'all',
        array
        (
            'conditions' => array
            (
                'Table2.foreign_key_id_table3' => X
            )
        )
    );

当你使用蛋糕的内置功能和课程时,还有很多其他有用的提示,所以我建议你花一些时间来正确学习蛋糕,它会让你的生活更轻松。

答案 1 :(得分:3)

我建议将Cake的find()方法用于模型。您所要做的就是创建适当的模型关联,Cake将为您完成工作。在您的情况下,它看起来像Table1模型belongsTo Table2和Table2 belongsTo表3。

表2将与Table1建立hasOnehasMany关系,表3与Table2具有相同的关系。

要提供真实世界的场景,请考虑无处不在的博客应用程序。 User可以创建PostsPost可以有多个Comments

<强>数据库

users
 - id
 - data

posts
 - id
 - user_id
 - data

comments
 - id
 - post_id
 - data

User模型

class User extends AppModel {
   $hasMany = array ( 'Post' );

   // ...
}

Post模型

class Post extends AppModel {
   $hasMany = array ( 'Comment' );
   $belongsTo = array ( 'User' );

   // ...
}

Comment模型

class Comment extends AppModel {
   $belongsTo = array ( 'Post' );

   // ...
}

一旦你有了关联,只需调用你感兴趣的任何对象的find()方法,Cake也会返回其他类的相关记录。