0

我是 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 中实现这些(上述)功能(在 RoR 中很容易由其 ORM 制作)?

感谢帮助...

神话冲刺

4

2 回答 2

2

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

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

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

上面的 find 调用从数据库中获取 id=1 的经理,并且由于您设置了关系 Manager 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 中,它们在您尝试访问结果时延迟执行。

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

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

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

我希望这能消除一些困惑。

于 2012-11-23T11:06:42.950 回答
0

我认为您正在寻找 CakePHP 的可包含行为

将可包含行为附加到您的模型很重要,否则它将不起作用。

于 2012-11-23T09:26:28.967 回答