Я использую 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 был успешно загружен, так что это не проблема.
Какую версию Datamapper вы используете? Похоже, это было зафиксировано в 1.8.1. Я использую 1.8.1 и у cascade_delete установлен FALSE, с ON DELETE CASCADE в моих FK, и приложение работает, как ожидалось. – glomad
1.8.2. Вы знаете, что такое исправление или где я могу найти набор изменений? –