Hello.

> From: Павел <[email protected]>
> To: [email protected]
> Subject: [Moscow.pm] Rose::DB update
> Message-ID: <[email protected]>
> Content-Type: text/plain; charset=koi8-r; format=flowed; delsp=yes
> 
> Здравствуйте,
> Нигде не могу найти пример update для Rose::DB,
> который бы работал не так:


это 2 разныхз действия перед сохранением: 

> my $page = Rugosa::MjPage->new(id_pages => $id_pages)->load;

это load 

>            $page->id_lang($id_lang);
>            $page->id_cat($id_cat);
> ....
> $page->id_nomer_100($var);

который после этих сеттеров выльется в sql update

> а как-то так:
> 
> $page = Rugosa::MjPage->new(id_lang =>$id_lang,
>                                        id_cat => $id_cat,
>                                        name_pages => $name_pages,
>                                       ........
>                                        id_nomer_100 => $var
>                                        );

а это --- конструктор, который кроме sql insert на сохранении ничего не выдаст

> если я передаю в new существующий id - при сохраниении пишет:
> DBD::mysql::st execute failed: Duplicate entry '19' for key 'PRIMARY' at

и т. о., чтобы сохранению быть в этом случае не sql insert а sql update, нужно
сначала проверить, не дупловат ли первичный ключ. Инлгда это умеет субд,
например, в mysql есть кляуза 'on exists update' для insert.

Однако, даже и в таком случае сильно не уверен, что делвть из new и потом save
не sql insert а sql update в некоторых случаях это хорошая идея для реализации
в orm. Бо одно дело сеттеры после load --- они меняют запись после sql select,
а другое дело аргументы new --- там поля в записи ещё не проиничены.

> а для каждого поля писать :
> $ob->field1($var);
> как-то не правильно мне кажется.
> Подскажите правильный вариант?

update_sometable(), конечно, вариант, но можно писать не для каждого поля через:

    my @update_pairs = ( 'field0' => \$var0, 'field1' => \$var1 );
    while (@update_pairs) {
        my ( $field => $var ) = map { shift @update_pairs } 0 .. 1; 
        $page->$field( $$var );
    }

--
Peter Vereshagin <[email protected]> (http://vereshagin.org) pgp: A0E26627 
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить