行。尽量简明扼要地阐述我的问题。我有这个庞大的项目,其主要目的是从Model数据生成配置文件。在为db配置信息收集数据时,我对如何以有效的方式获取适当的信息感到茫然。模型:区,部门,用户,承运人。
| id | name |
| id | name | district_id | tone_name | tone_length |
| id | name | phone | email | carrier_id | notify_method (tiny int) |
| id | name | mms_gateway |
| id | user_id | department_id | role |
使用与上述所有模型相关联的字段为每个区域生成配置文件。对于区中的每个部门,将以下内容添加到字符串中,完成后将保存到配置文件中:
[tone_name] //comes from department name
tone = 123 //from department tone
tone_length = 4 //from department tone_length
mp3_emails = person@gmail.com, person2@gmail.com ... //comes from user email
amr_emails = 5551239999@vzwipix.com //concat of user phone and carrier mms_gateway
基本上,部门的mp3_emails和amr_emails 的列表应基于notify_method
用户字段中基于该部门的用户生成。我已经能够将这些电子邮件字段中的所有内容添加到配置文件中,其中包含以下内容:
//districts controller
public function generate_config(){
$districts = $this->District->find('All');
$this->set(compact('districts'));
}
现在,对于视图文件:
<?php
$output = '';
$br = " \r\n";
$unrelated = array('id', 'name', 'district_id', 'tone_name');
foreach($districts as $district){
$name = $district['District']['name'];
$output .= "#{$name} configuration".$br;
$departments = $district['Department'];
foreach($departments as $department){
$output .= "[".$department['tone_name']."]".$br;
foreach($department as $key => $value){
if(!empty($value)&&(!in_array($key, $unrelated))){
$output .= $key." = ".$value.$br;
}
}
$output .= $br;
}
}
echo nl2br($output);
?>
输出类似这样的东西
#District 1 config
[Department1]
tone = 123
tone_length = 4
[Department2]
tone = 24.7
tone_length = 2
我需要做的是为每个部门生成电子邮件列表,但我无法找到一种合理的方法来执行此操作。我觉得如果departments
和users
使用HABTM关系而不是hasMany通过会更容易,我觉得我必须使用它,因为我正在为关系保存额外的数据。有什么建议??不要犹豫,问我是否应该更清楚,但我试图提供所有相关信息,同时尽量减少压倒性的细节。谢谢!!!
修改
感谢@ Drewdiddy611,我的理智得以幸免。可容忍的行为是这个问题的完美之选。所以,希望有人会避免一个完整的项目大修 - 这是我刚刚做的事情 - 并使用可包含的行为。
只需将以下内容添加到我的模型中:
public $ actsAs = array('Containable');
然后,我能够运行查询查询,按照下面的建议实现可包含的行为,我能够为每个District
/ Department
的迭代添加更大的深度。这非常简单,因为返回的数组就像下面选择的答案一样!谢谢!
答案 0 :(得分:1)
我认为根据您的表/数据使用'hasMany through'关系是正确的。在cakephp 2.1中,他们为HABTM关系添加了一个“唯一”键,您可以将其设置为“keepExisting”,并且它应该绕过丢失的数据。
http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany-through - 查看主标题下方的“2.1更改”部分。
也许试一试?
您还可以查看可包含的行为。 然后你可以做以下事情:
<?php
//model
var $actsAs = array('Containable');
//controller
$this->District->contain(array(
'Department' => array(
'DepartmentPosition' => array(
'User' => array(
'Carrier'
)
)
)
));
$districts = $this->District->find('all');
$this->set(compact('districts'));
// I believe this will be the outcome after the find.
///////////////////////////////////////////////////////
// array(
// [0] => array(
// 'District' => array(...),
// 'Department' => array(
// [0] => array(
// '...' => '...', // repeated...
// 'DepartmentPosition' => array(
// [0] => array(
// '...' => '...', // repeated...
// 'User' => array(
// '...' => '...', // repeated...
// 'Carrier' => array(
// '...' => '...', // repeated...
// )
// )
// )
// )
// )
// )
// )
// )
?>
-Andrew