CakePHP vs Rails如何从相关表中检索数据

时间:2012-11-22 12:54:40

标签: ruby-on-rails-3 cakephp-2.1

我是CakePHP的新手,但我使用的是Rails。我想在CakePHP中做类似的事情:

class Manager < ActiveRecord::Base
    has_many :employees
end

然后问这样的对象:

m = Manager.find(1)
# Sends SQL query SELECT COUNT * FROM EMPLOYEES WHERE MANAGER_ID = 1
count = m.employees.count

# Sends SQL query SELECT * FROM EMPLOYEES WHERE MANAGER_ID = 1
m.employees.each do |e|
    puts e.name
end

我在CakePHP中有这段代码......

class Manager extends AppModel {
    public $hasMany = array(
        'Employee' => array(
            'className'  => 'Employee',
            'order'      => 'Employee.created DESC'
        )
    );
}

class Employee extends AppModel {
    public $belongsTo = 'Manager';
}

如何在CakePHP中实现这些(上面的)功能(由ORM轻松制作)?

感谢您的帮助...

神话冲刺

2 个答案:

答案 0 :(得分:2)

您的问题归结为“我如何检索ID = 1的经理并找到他的员工。

在CakePHP中,您将发出以下查找查询以检索所需的经理条目:

$manager = $this->Manager->findById(1);
// or
$manager = $this->Manager->find('first', array(
    'conditions' => array(
        'Manager.id' => 1
    )
);

以上查找调用从数据库中获取id = 1的管理器,并且因为您设置了管理员hasMany Employee的关系,结果还将包含Employee.created DESC订购的管理器的所有员工。

结果集看起来像这样:

Array
(
    [Manager] => Array
        (
            [id] => 1
            [field1] => value1
        )

    [Employee] => Array
        (
            [0] => Array
                (
                    [id] => 2
                    [manager_id] => 1
                    [name] => Bar
                )

            [1] => Array
                (
                    [id] => 1
                    [manager_id] => 1
                    [name] => Foo
                )

        )

)

正如您所看到的,CakePHP使用数组格式返回结果,而不是Ruby on Rails中的对象。因此,您必须在结果数组中访问相关数据。

CakePHP和Ruby on Rails(RoR)之间的另一个重要区别是,在CakePHP中,对数据库的查询在您调用它们时执行,而在RoR中,它们在您尝试访问结果时就会被执行。 / p>

为了补充您的RoR示例以访问员工,这里是CakePHP版本:

$employee_count = count($manager['Employee']);

foreach ($manager['Employee'] as $e) {
    echo $e['name'];
}

我希望这可以解决一些困惑。

答案 1 :(得分:0)

我认为您正在寻找CakePHP的containable行为。

将可包含的行为附加到您的模型非常重要,否则它将无效。