Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

ORM запрос
http://forum.kohanaframework.su/viewtopic.php?f=33&t=554
Страница 1 из 1

Автор:  rain2 [ 17 янв 2013, 20:11 ]
Заголовок сообщения:  ORM запрос

Есть 4 таблицы

1. продукты
2. купленные продукты (содержит id и id продукта)
3. категории
4. продактс_категории (содержит id категории и id продукта)

Нужно сделать 3 запроса

1 Это вывести все новые продукты
Код:
$products = ORM::factory('product')->limit(6) ->order_by('date', 'DESC')->find_all();


2.
Вывести все продукты которые были куплены

3 Вывести все категории в которых есть продукты которые были куплены

Помогите с 2 последними запросами

Автор:  Zorato [ 18 янв 2013, 14:10 ]
Заголовок сообщения:  Re: ORM запрос

2.
Код:
$products = DB::select('products.*')
                           ->from('products')
                           ->join('sold','INNER')
                               ->on('products.id','=','sold.product_id')
                           ->group_by('sold.product_id')
                           ->as_object('Model_Product')
                           ->execute();

sold - ваша 2я таблица, products - 1я.
3. Выполняем 2й запрос. Далее:
Код:
//$products = ... execute(); - 2й запрос
$products->as_array('id'); //получили массив с результатами, где ключем является id продукта
$categories = DB::select('categories.*')
->from('categories')
->join('products_categories')
   ->on('products_categories.category_id','=','categories.id')
->where('products_categories.product_id','IN',array_keys($products)) //выбираем только проданные продукты
->group_by('products_categories.category_id') // отсекаем повторы
->as_object('Model_Category') // результат - объекты ORM модели
->execute();

Надеюсь угадал с названиями таблиц и колонок, если нет - поправьте.
П.С. Пишите, если не получилось - будем додумавыть если что не так.
П.П.С. В принципе 3й запро можно делать с 2мя join без использования результатов 2го запроса. Если надо - могу написать

Автор:  rain2 [ 18 янв 2013, 15:04 ]
Заголовок сообщения:  Re: ORM запрос

Первый запрос работает, второй выдает ошибку на array_keys($products),(mysql_data_seek() expects parameter 2 to be long, string given).

Что значит
Код:
->as_object('Model_Category') // результат - объекты ORM модели

это делается только для того что бы обращаться к нему как к объекту модели? Где эти запросы вставлять, в контроллере или их можно запихнуть в модель? Извините если задаю глупые вопросы.

Автор:  Zorato [ 18 янв 2013, 19:54 ]
Заголовок сообщения:  Re: ORM запрос

rain2 писал(а):
Первый запрос работает, второй выдает ошибку на array_keys($products),(mysql_data_seek() expects parameter 2 to be long, string given).

Проверьте метод as_array() - после его выполнения в переменной $products должен быть массиив с результатом запроса.
rain2 писал(а):
Что значит
Код:
->as_object('Model_Category') // результат - объекты ORM модели

это делается только для того что бы обращаться к нему как к объекту модели?

Да, это значит, что если переменную $categories засунуть в цикл:
Код:
foreach($categories as $category){ 
// переменная $category объект класса Model_Category, можно пользоваться всеми прелестями ORM(save(), delete() и т.д.)
}

rain2 писал(а):
Где эти запросы вставлять, в контроллере или их можно запихнуть в модель?

Я думаю, лучше в модель: на каждый подобный запрос - 1 метод. Что-то вроде
Код:
public function get_sold_item_categories()
{
  //запрос
  return $categories;
 }

Можно даже сделать его статическим.
Хотя никто не запрещает в контроллер...

Автор:  rain2 [ 18 янв 2013, 22:04 ]
Заголовок сообщения:  Re: ORM запрос

Zorato писал(а):
Проверьте метод as_array() - после его выполнения в переменной $products должен быть массиив с результатом запроса.

Спасибо , где то была моя ошибка, все работает
Код:
public function get_sold_item_categories()
    {
        $products = ORM::factory('product')->get_product_ordered();
        $a = $products->as_array('id'); //получили массив с результатами, где ключем является id продукта
        // echo($a);die;
        $categories = DB::select('categories.*')
                ->from('categories')
                ->join('products_categories')
                ->on('products_categories.category_id', '=', 'categories.id')
                ->where('products_categories.product_id', 'IN', array_keys($a)) //выбираем только проданные продукты
                ->group_by('products_categories.category_id') // отсекаем повторы
                ->as_object('Model_Category') // результат - объекты ORM модели
                ->execute();
        return $categories;

    }

Спасибо за помощь, но я хочу понять, собственно, это же не ORM, методами ORM такой запрос реально сделать?
И еще вопрос в догонку, у меня есть таблицы в базе
Код:
categories
orders
products
products_categories
products_comments
products_delivery
products_images
products_orders

все они между собой связаны. Вопрос заключается в том как это все правильно проектировать, как все правильно спланировать, возможно есть какие то инструменты для этого или программы. Я не программист , это так сказать хобби и некоторые банальные вещи для меня превращаются в пытку. Приведу пример, например у меня есть категории и продукты , их связывает таблица products_categories, например мы удалили продукт , следовательно удаляем из таблицы products_categories связь . Это еще можно держать в голове, но что делать если связь с несколькими таблицами, или вы для этого пользуетесь листом A4. Надеюсь я понятно сформулировал вопрос?

Автор:  Zorato [ 19 янв 2013, 03:18 ]
Заголовок сообщения:  Re: ORM запрос

rain2 писал(а):
все они между собой связаны. Вопрос заключается в том как это все правильно проектировать, как все правильно спланировать, возможно есть какие то инструменты для этого или программы. Я не программист , это так сказать хобби и некоторые банальные вещи для меня превращаются в пытку. Приведу пример, например у меня есть категории и продукты , их связывает таблица products_categories, например мы удалили продукт , следовательно удаляем из таблицы products_categories связь . Это еще можно держать в голове, но что делать если связь с несколькими таблицами, или вы для этого пользуетесь листом A4. Надеюсь я понятно сформулировал вопрос?


Лично я пользуюсь бесплатной dbForge Studio for MySQL. Удобно редактировать таблицы и данные + есть дизайнер диаграммы - как раз тот пресловутый листик а4. Теперь о связях в таблицах. Все необходимые связи надо организовывать через внешние ключи (foreign keys), т.е. в таблице products_categories колонка product_id должна ссылаться на колонку id из таблицы products. Если внешний ключ выставлен, то:
1) Mysql сам проверяет значения product_id, чтобы вы случайно не вставили несуществующий id.
2) При удалении продукта (записи в таблице products) mysql сам удалит все записи из таблицы product_categories, где product_id равен id удаленного продукта. Для этого при создании ключа надо прописать действия при удалении и обновлении. Подробнее http://denis.in.ua/foreign-keys-in-mysql.htm см. ON UPDATE и ON DELETE.

Что касается запоминания самой архитектуры приложения, связей и прочего тут 3 варианта: лист а4, доска с маркерами на стене или схема базы на компе(тот же dbforge легко сделает из бд картинку со схемой - таблицами, связями, колонками). Лично я пользуюсь всеми 3 способами.

Страница 1 из 1 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/