我是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轻松制作)?
感谢您的帮助...
神话冲刺
答案 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行为。
将可包含的行为附加到您的模型非常重要,否则它将无效。