我有两个Myisam表,让我们说父母和孩子。父是在perl脚本中创建的。父母是孩子获取信息的地方(不是编辑),而儿童则拥有独特的信息。遵循Cakephp命名约定,它们通过Parent的id字段和子节点的parent_id连接。当通过另一个应用程序(通过Perl添加记录)更新父表时,它将显示在Child中,但如果删除了记录,则Child不会更新。是否有一种方法遵循cakephp约定来更新表(删除在Parent中删除的记录)? 我确实有'依赖'=>在子表的父表中为true?这需要在子表中吗?或者这不重要,因为该表在应用程序之外更新了吗?
如果没有别的,我可以设置一个cron作业来定期检查表,但我不知道如何通过查找/删除子表中不再存在的子表中的记录MYSQL 即可。联接的组合和诸如此类的<>?所以我的问题是,如果表在应用程序之外更新,我可以用cakephp吗?或者我将如何使用mysql?
代码:
<?php
class Drug extends AppModel {
var $name = 'Drug';
var $order = "Drug.generic ASC";
var $useDbConfig = 'default';
var $actsAs = array('ExtendAssociations', 'Containable');
var $hasOne = array(
'FrenchTranslation' => array(
'className' => 'FrenchTranslation',
'dependent' => true
),
'GermanTranslation' => array(
'className' => 'GermanTranslation',
'dependent' => true
),
'SpanishTranslation' => array(
'className' => 'SpanishTranslation',
'dependent' => true
)
);
}
?>
<?php
class FrenchTranslation extends AppModel {
var $name = 'FrenchTranslation';
var $validate = array(
'drug_id'=>array(
'The drug_id must be unique.'=>array(
'rule'=>'isUnique',
'message'=>'The Drug ID must be unique.',
'on'=>'create'
),
'The drug_id must be numeric.'=>array(
'rule'=>array('numeric'),
'message'=>'The Drug ID must be numeric.'
)
),
'id'=>array(
'The id must be unique.'=>array(
'rule'=>'isUnique',
'message'=>'The ID must be unique.',
'on'=>'create'
),
'The id must be numeric.'=>array(
'rule'=>array('numeric'),
'message'=>'The ID must be numeric.'
)
)
);
var $belongsTo = array(
'Drug' => array(
'className' => 'Drug',
'foreignKey' => 'drug_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'User'=>array(
'className'=>'User',
'foreignKey'=>'user_id'
),
);
}
?>
答案 0 :(得分:1)
这是一个可以用来获取所有孤儿子记录的小查找电话:
$this->Drug->FrenchTranslation->find('all', array(
'fields' => array('id'),
'conditions' => array(
'Drug.id' => null
),
'contain' => array(
'Drug' => array(
'fields' => array('id')
)
)
));
这应该像这样调用SQL命令
SELECT `FrenchTranslation`.`id`, `Drug`.`id`
FROM `french_translations` AS FrenchTranslation
LEFT JOIN `drugs` AS `Drug` ON (`Drug`.`id` = `FrenchTranslation`.`drug_id`)
WHERE `Drug`.`id` IS NULL
这将返回所有孤立的子记录,然后您可以迭代并删除它们。你必须为每个孩子做这件事。