2015-01-20 4 views
0

Я использую MySQL, используя таблицы InnoDB с CodeIgniter Datamapper в своем приложении PHP. Часто пользователю предоставляется возможность удалить запись через приложение, инициировав вызов функции -> delete. Когда запись имеет дочерние записи (один-к-одному или один-ко-многим), мне также хотелось бы удалить эти записи вместе с родительской записью, если она указана ограничениями FK в базе данных.Как использовать параметр конфигурации cascade_delete в CodeIgniter Datamapper

В этом случае у меня есть 2 таблицы, элементы и input_lines. Я подтвердил, что оба используют InnoDB. Каждый элемент может иметь много параметров ввода, поэтому в input_lines есть поле с именем item_id, которое установлено в NULL, индексировано и имеет ограничения FK (ВКЛЮЧЕН КАСКАДОМ УДАЛИТЬ И ОБНОВЛЕНИЕ КАСКАДА). Я поставил элемент конфигурации в файле конфигурации DM в

$config['cascade_delete'] = FALSE 

Поскольку в документации говорит, что вы должны сделать, если вы используете ON UPDATE/DELETE CASCADE. Однако, когда пользователь инициирует метод $ item-> delete(), удаляется только элемент, а поля item_id в записях entry_line, связанных с элементом, имеют значение null.

Мои модели выглядят следующим образом:

class Item extends DataMapper { 

    public $has_many = array('labour', 'item_type', 'input_line', 'custom_item_type'); 

    ... 
} 

class Input_line extends DataMapper { 

    public $has_one = array('item'); 
    ... 
} 

Я попытался это с cascade_delete = ложь и правда, и он не будет работать. Я знаю, что ограничения работают, потому что удаление записи с MySQL напрямую работает так, как ожидалось, удаляя дочерние записи.

Что мне не хватает? Почему он устанавливает для полей FK значение null вместо удаления записи?

EDIT 1:

я решил вопреки здравому смыслу, чтобы отладить функцию удаления в datamapper.php (каталог библиотек).

Я заметил этот код в этой функции:

// Delete all "has many" and "has one" relations for this object first 
foreach (array('has_many', 'has_one') as $type) 
{ 
    foreach ($this->{$type} as $model => $properties) 
    { 
     // do we want cascading delete's? 
     if ($properties['cascade_delete']) 
     { 
     .... 

Так что я var_dumped содержимое $ свойств, и я увидел это:

array (size=8) 
    'class' => string 'labour' (length=6) 
    'other_field' => string 'item' (length=4) 
    'join_self_as' => string 'item' (length=4) 
    'join_other_as' => string 'labour' (length=6) 
    'join_table' => string '' (length=0) 
    'reciprocal' => boolean false 
    'auto_populate' => null 
    'cascade_delete' => boolean true 

Он появляется по умолчанию для того, когда модель Безразлично» t имеет свойство, специально инициализированное, переопределяет значение конфигурации. Кажется, это слишком ярость, поэтому я определенно что-то делаю неправильно ... верно? Я действительно, действительно хочу, чтобы избежать взлома основных файлов DM ...

EDIT 2:

Я думал, может быть конфигурационный файл был не найден, но я проверил журналы и там вы что файл конфигурации Datamapper был успешно загружен, так что это не проблема.

+0

Какую версию Datamapper вы используете? Похоже, это было зафиксировано в 1.8.1. Я использую 1.8.1 и у cascade_delete установлен FALSE, с ON DELETE CASCADE в моих FK, и приложение работает, как ожидалось. – glomad

+0

1.8.2. Вы знаете, что такое исправление или где я могу найти набор изменений? –

ответ

0

Не похоже, что у каждого есть ответы.

Мое решение состояло в том, чтобы изменить свойство в библиотеке datamapper $ cascade_delete на false, так как теперь оно установлено в true. К сожалению, мне приходится прибегать к взлому ядра, но DM не будет уважать мои изменения в файле конфигурации для cascade_delete, поэтому у меня нет другого выбора.

Если кто-то сталкивается с этим вопросом и столкнулся с такой проблемой раньше, прокомментируйте.

0

я сталкивался с той же проблемой, но в конце концов я просто сделал так:

$sql = "DELETE FROM EVENT WHERE event_id=".$event_id.";"; 
$this->db->query ($sql); 

В случае мы установили «ON DELETE CASCADE» для внешнего ключа, который относится к event_id, выше SQL работает отлично , поэтому я просто называю это напрямую.