0

我有两个 Myisam 表,假设是 Parent 和 Child。Parent 是在 perl 脚本中创建的。Parent 是孩子获取信息的地方(不是用于编辑),所有信息都是相同的,而 Child 拥有它独有的信息。遵循 Cakephp 命名约定,它们通过 Parent 的 id 字段和 child 的 parent_id 连接。当通过另一个应用程序(通过 Perl 添加的记录)更新父表时,它会显示在子表中,但如果删除了一条记录,则子表不会更新。有没有办法遵循 cakephp 约定来更新表(删除在 Parent 中删除的记录)?我在孩子的父表中有'依赖'=> true?那需要在子表中吗?或者这无关紧要,因为表格是在应用程序之外更新的?

如果不出意外,我也许可以设置一个 cron 作业来定期检查表,但我不确定如何通过MYSQL查找/删除父表中不再存在的子表中的记录。连接的组合以及在哪里这样的 n 这样的 <>?所以我的问题是如果表格在应用程序之外更新,我可以用 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'
    ),
    );
}
?>
4

1 回答 1

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

这将返回所有孤立的子记录,然后您可以遍历并删除它们。你必须为每个孩子做这件事。

于 2012-06-06T15:17:45.347 回答