Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 28 мар 2024, 15:03

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: ORM один ко многим
СообщениеДобавлено: 28 май 2013, 19:15 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 23 июл 2012, 21:58
Сообщения: 100
Доброго времени суток.
Сразу к делу...
Модели:
Код:
class Model_Order extends ORM {
    protected $_primary_key = 'id';
    protected $_has_many = array(
        'items' => array(
            'model'       => 'orderitems',
            'foreign_key' => 'order_id',
        ),
    );
}

Код:
class Model_Orderitems extends ORM {
    protected $_table_name = 'orders_items';
    protected $_primary_key = 'id';
}

Кусок кода отвечающий за сохранение в БД:
Код:
$order = ORM::factory('order');
$order->values($data);
try{
     $order->save();
     foreach($this->cart as $c){
           $items = $order->items;
           $item['product_id']=$c['p']->id;
           $item['product_price']=$c['p']->price;
           $item['material_id']=$c['m']->id;
           $item['material_price']=$c['m']->price;
           $items->values($item)->save();
       }........

Все записывается, но в таблице orders_items ни как не хочется писаться в order_id нужное число, пишет ноль туда, хоть ты тресни.
Гляньте пожалуйста со стороны, чего не так сделал?
..чую дело в контроллере, но не знаю как правильно нужно..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM один ко многим
СообщениеДобавлено: 28 май 2013, 19:38 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
borodatych> может ты пытаешься добавить значение которое уже есть или которого нет в таблице связанной ключем?

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM один ко многим
СообщениеДобавлено: 29 май 2013, 04:56 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 23 июл 2012, 21:58
Сообщения: 100
to WinterSilence
В том то и дел, что нет, насколько могу судить.
В orders_items остались две колонки - это связующая order_id и собственная id.
Да и сохраняется все, кроме order_id.

Попробовал сменить тип у order_id с int на varchar, вдруг чего все таки пишет.
Оказалось тупо NULL. Связь вроде бы есть, суда по тому что происходит запись.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM один ко многим
СообщениеДобавлено: 29 май 2013, 05:16 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 23 июл 2012, 21:58
Сообщения: 100
Странно конечно. Попробовал, по моему насильно, указать order_id, и заработало:
Код:
$item['order_id'] = $order->pk();

Если это единственное решение и только так можно добиться ожидаемого, то странно почему Kohana не делает это по умолчанию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM один ко многим
СообщениеДобавлено: 29 май 2013, 13:51 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
кстати в Model_Order отсутствует $_table_name и почему $items = $order->items; неходится в цикле?

Цитата:
Если это единственное решение и только так можно добиться ожидаемого, то странно почему Kohana не делает это по умолчанию.

а поле order_id имеет свойство AUTO_INCREMENT?

sql дамп таблиц всегда пишите и что именно данный код должен делать

кстати советую данные корзины хранить не так, а в singleton объекте или что наверное правильнее в модели(Kohana_Model) и дописать методы для работы с ней - получите универсальную корзину, которую можно вставить и в другой проект. хотя первый вариант более универсальный, второй ближе к идеям фреймворка.

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM один ко многим
СообщениеДобавлено: 11 июн 2013, 05:39 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 23 июл 2012, 21:58
Сообщения: 100
to WinterSilence
Извиняюсь, что так тянул, забылось.. но тема была закреплена на панели и ожидала очереди)

Цитата:
кстати в Model_Order отсутствует $_table_name

Тут применяется правило(или как там правильно) Kohana: модель - Order, база -Orders. ..где то было в доках..

Цитата:
почему $items = $order->items; неходится в цикле?

Тут на самом деле, кому как нравится, тот так и организовывает.
Решил так, так как мне больше нравится такая схема.
То есть заказ идет один, в него пишем кто, от куда, когда.
А в orders_items пишем построчно что было куплено, через связь один ко многим из orders.

Цитата:
sql дамп таблиц всегда пишите и что именно данный код должен делать

Смысла, если честно, не вижу в дампе..
И таки да, суть была в том, что у orders была связь один ко многим с orders_items через поле order_id в orders_items, что в принципе можно было понять по моделям, просто я явно не написал.
..понимаю лень и все такое, впредь буду писать)..
Дак вот, в это поле order_id передавался всегда ноль за место ожидаемого ID, причем, повторюсь, все остальное писалось нормально.

Цитата:
кстати советую данные корзины хранить не так, а в singleton объекте или что наверное правильнее в модели(Kohana_Model) и дописать методы для работы с ней - получите универсальную корзину,

Универсальность - это вы про такое:
Код:
<td id="counter" class="counter">'.Counter::instance()->put($k,$count).'</td>

..счетчик для кол-во товаров ввиде плагина, если интересно посмотреть, позже выложу..
Если оно, то потихоньку все перевожу на такую схему..
Но даже в этом случае можно через сессии. Буду рад увидеть доводы хранения покупки не в сессии, а в объекте..

to all
По поводу хранения данных корзины, кто что посоветует.
Или кто как использует? ..возможно есть еще способы..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM один ко многим
СообщениеДобавлено: 11 июн 2013, 11:10 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
Цитата:
почему $items = $order->items; неходится в цикле?

это не есть гуд потому, что $order->items в цикле не изменяется т.ч. это бесполезная лишняя нагрузка. т.е. говнокод
Цитата:
Смысла, если честно, не вижу в дампе..И таки да, суть была в том, что у orders была связь один ко многим с orders_items через поле order_id в orders_items, что в принципе можно было понять по моделям, просто я явно не написал.

сам себе помочь не хочешь? глупо
Цитата:
Но даже в этом случае можно через сессии. Буду рад увидеть доводы хранения покупки не в сессии, а в объекте..

я про сессии вообще ничего не говорил.я имел ввиду взаимодействуешь ты с корзиной ты через класс(вроде твоего последнего примера), а как уж он хранит данные дело другое. самый удачный вариант это хранить данные в Session-database, только под корзину сделать отдельные настройки, чтобы данные хранились по несколько дней т.к. часто бывает что клиент заходит, видит старый не оформленный товар в корзине и что-то из него покупает, по опыту знаю таких 5-10%

если хочешь кидай свой класс сюда, совместными усилиями допилим

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM один ко многим
СообщениеДобавлено: 11 июн 2013, 11:48 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 23 июл 2012, 21:58
Сообщения: 100
Цитата:
это не есть гуд потому, что $order->items в цикле не изменяется т.ч. это бесполезная лишняя нагрузка. т.е. говнокод

Не соглашусь..
Код:
        if($this->bttn('orderbttn')){ // Проверяем нажата ли кнопка была
            $data = Arr::extract($_POST,array('name','fone','address','email'));
            $data['date']=date("Y-m-d H:i:s");
            $data['order_status'] = 'New';
            $order = ORM::factory('order'); // Вот тут создаем один раз объект Order (данные о покупателе)
            $order->values($data);
            try{ // Если
                $order->save();                                      // Сейвится? (все поля заполнены верно)
                $orders=$this->session->get('orders');        // Продолжаем. Дергаем корзину. По идее нужно только кол-во за позицию.
                foreach($this->cart as $k=>$c){                // Это массив из объектов(продукт,материал)
                    $items = $order->items;                       // И вот тут мы в цикле создаем новый пустой объект(единицу покупки) через связь в ORM!
                    $item['order_id']          = $order->pk();   // Это ожидаемый order_id, из-за чего весь сыр-бор
                    $item['product_id']      = $c['p']->id;       // ID товара
                    $item['product_price']  = $c['p']->price;   // Цена товара
                    $item['material_id']      = $c['m']->id;       // ID материала
                    $item['material_price']  = $c['m']->price;  // Цена материала
                    $item['count'] = $orders[$k]['count'];      // Кол-во из сессии за единицу. Ключи совпадают, постарался)
                    $items->values($item)->save();
                }
                $this->session->delete('orders'); $msg='ok';
            }catch(ORM_Validation_Exception $e){ $msg='err'; $errors = $e->errors('validation'); }
        }

..а может и я чего не понимаю..

Цитата:
sql дамп таблиц всегда пишите и что именно данный код должен делать

Возможно я не правильно понял фразу. vardump имелось ввиду?

Цитата:
если хочешь кидай свой класс сюда, совместными усилиями допилим

В принципе, весь код после события я привел..

Благодарю за участие)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM один ко многим
СообщениеДобавлено: 11 июн 2013, 13:42 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
Цитата:
Не соглашусь..

аргументируй
Цитата:
Возможно я не правильно понял фразу. vardump имелось ввиду?

ошибка могла быть в структуре базы, тем более чтобы работать с данными надо понимать их структуру

чуть позже по коду отпишусь

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM один ко многим
СообщениеДобавлено: 11 июн 2013, 13:49 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 23 июл 2012, 21:58
Сообщения: 100
Цитата:
аргументируй

В коде старался от комментировать..

Цитата:
ошибка могла быть в структуре базы, тем более чтобы работать с данными надо понимать их структуру

Я же писал, что все работает, за исключением одного непонятного момента..


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group