Как использовать опцию конфигурации cascade_delete в CodeIgniter Datamapper

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

В этом случае у меня есть 2 таблицы, элементы и input_lines. Я подтвердил, что оба используют InnoDB. Каждый элемент может иметь много input_lines, поэтому input_lines имеет поле item_id, которое имеет значение NULL, индексируется и имеет ограничения FK (ON CASCADE DELETE и ON CASCADE UPDATE). Я установил элемент конфигурации в файле конфигурации DM как

$config['cascade_delete'] = FALSE

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

Мои модели выглядят так:

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 = false и true, и это не будет работать. Я знаю, что ограничения работают, потому что удаление записи с MySQL напрямую работает, как ожидалось, удаляя дочерние записи.

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

РЕДАКТИРОВАТЬ 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 содержимое $ properties, и я увидел это:

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

По умолчанию, когда модель не имеет специально инициализированного свойства, она переопределяет значение конфигурации. Это кажется слишком явной ошибкой, поэтому определенно что-то я делаю где-то неправильно … верно? Я действительно очень хочу избежать взлома файлов ядра DM …

РЕДАКТИРОВАТЬ 2:

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

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 работает нормально, поэтому я просто вызываю его напрямую.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector