MySQL删除仅存在于子表/ cakephp更新中的记录?

时间:2012-06-06 14:38:30

标签: mysql cakephp

我有两个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'
    ),
    );
}
?>

1 个答案:

答案 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

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