2013-07-23 2 views
1

я могу удалить записи таблицы с этим кодом:Брус удалить только на один единственный экземпляр объекта DBIC

foreach my $id (@$idarray) { #idarray is an array reference 
$c->model('My::DB')->find($id)->delete; 
} 

Что выше код работает только тогда, когда @ $ IdArray имеет более одного значения, но терпит неудачу, когда только 1. Некоторые идеи ребята?

Ошибка, когда я только удалить 1 запись:

Can't use string ("61") as an ARRAY ref while "strict refs" in use 

61 есть только один пример. Представляет $ ID

значения образца IdArray: $idarray = [61, 1, 2, 3];

+0

какое сообщение об ошибке вы получаете от отказа? –

+0

Нельзя использовать строку («61») (это 61 id $) как ARRAY ref при использовании «строгих ссылок» –

+0

Можете ли вы также показать входные значения, этот массив refernce содержит то, что в случае, если он содержит больше, чем одно значение. –

ответ

1

говорит сообщение об ошибке, что значение 61 используются в качестве массива Другой крупный, это означает, что в случае одного значения, я думаю $idarray содержит только одно значение, а не массив Refernce, что означает, что попытаться сделать это как

if(ref $idarray eq 'ARRAY') { 
    foreach my $id (@$idarray) { #idarray is an array reference 
    $c->model('My::DB')->find($id)->delete; 
} else{ 
    $c->model('My::DB')->find($idarray)->delete; 
} 
+0

Да, я понимаю, что, выполняя var dump по одному значению, он не вернет ссылку на массив, а просто одну строку. Но в вашем ответе 'eq 'ARRAY'' также может обнаружить ссылку на массив? –

+0

да, пожалуйста, взгляните на функцию ref.'ref $ idarray' скажет вам, будет ли его массив ref или нет. –

+0

oh пропустил вашу 'ref' часть –

4

Вы можете лучше сделать это как:

$c->model('My::DB')->search({ 'id' => $idarray })->delete_all; 

DBIx :: Class будет AUTOMA чтобы определить, проходите ли вы в одном значении или массиве ref и делаете правильную вещь. Это также создаст единую инструкцию удаления для вашей БД, которая будет более эффективной, чем выполнение нескольких одиночных удалений в вашей РСУБД.

+0

Спасибо, я попробую этот –

Смежные вопросы