Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PHP для продвинутых.docx
Скачиваний:
16
Добавлен:
01.07.2025
Размер:
12.54 Mб
Скачать

Сложные запросы

JOIN Query builder. Листинг 16.11

$query = DB::select(‘authors.name’, ‘posts.content’)

->from(‘authors’)

->join(‘posts’)

->on(‘authors.id’, ‘=‘, ‘posts.author_id’)

->where(‘authors.name’, ‘=‘, ‘smith’)

Агрегирующие запросыQuerybuilder. Листинг 16.12

$query = DB::select(‘username’, array(‘COUNT("id")’, ‘total_posts’)

->from(‘posts’)

->group_by(‘username’)

->having(‘total_posts’, ‘>=‘, 10)

Подзапросы Query builder. Листинг 16.13

$sub = DB::select(‘username’, array(‘COUNT("id")’, ‘total_posts’)

->from(‘posts’)->group_by(‘username’)->having(‘total_posts’, ‘>=‘, 10);

$query = DB::insert(‘post_totals’, array(‘username’, ‘posts’))->select($sub)

Вложенные запросы Querybuilder. Листинг 16.14

// SELECT * FROM `users` WHERE ( `id` IN (1, 2, 3, 5) OR ( `last_login` <= 1276020805

OR `last_login` IS NULL ) ) AND `removed` IS NULL

$query = DB::select()->from(‘users’)

->where_open()

->where(‘id’, ‘IN’, $expired)

->and_where_open()

->where(‘last_login’, ‘<=‘, $last_month)

->or_where(‘last_login’, ‘IS’, NULL)

->and_where_close()

->where_close()

->and_where(‘removed’,’IS’, NULL);

17. Модуль orm

Задача ORM (англ. Object-relational mapping, - рус. Объектно-реляционное отображение) – упростить организацию связей таблиц баз данных, и данный модуль использует методы Database. Следовательно, для его использования, помимо раскомментирования самого модуля ORM, должен быть подключен модуль Database.

Подключение ORM в файле bootstrap.php. Листинг 17.1

Kohana::modules(array(

‘database’ => MODPATH.’database’,

‘orm’ => MODPATH.’orm’,

));

Для того чтобы начать работу с базой данных с помощью модуля ORM, необходимо в папке model создать контроллер, наследующий класс ORM. Имя контроллера должно совпасть с именем таблицы из базы данных. Если таблица в базе данных имеет множественное имя, например, products, то имя модели должно быть в единственном числе: Model_Product.

Создание модели. Листинг 17.2

class Model_Maintext extends ORM {

}

Создание такой модели аналогично выполнению следующего SQL-запроса: SELECT * FROMproducts.Причем, по умолчанию считается, что имя модели - это единственное число от имени таблицы, первичный ключ – это поле id, и мы используем дефолтные настройки к базе данных, которые были прописаны в модуле database().

В идеале, одна модель соотносится с одной таблицей.

Но иногда возникают задачи, когда нужно для одной таблицы создать несколько моделей. Например, для таблицы users одна модель будет наследована откласса авторизации, а вторая модель – от класса ORM.

Создание модели extendsORM. 17.3

class Model_User extends ORM {

}

Создание модели extends Model_Auth_User. 17.4

class Model_Usersimage extends Model_Auth_User {

}

В таком случае, у нас будут две модели с разными именами. И для того, чтобы привязать модель с именем usersimage к таблице users, необходимо создать переменную $_table_name, в которой содержится имя таблицы для текущей модели.

Переопределять параметры по умолчанию необходимо в следующихслучаях:

  1. Если имя модели не сопостовимо с множественным числом имени таблицы;

  2. Если имя столбца первичного ключа имеет имя не id, а какое-нибудь другое;

  3. Если для данного модуля необходимо поменять группу настроек базы данных.

Создание модели с переопределенными параметрами. Листинг 17.5

class Model_Product extends ORM {

protected $_table_name = ‘products’;

protected $_primary_key = ‘id’;

protected $_db_group = ‘default’;

}

INSERT

INSERT. Листинг 17.6

public function action_index() {

$a = ORM::factory(‘product’);

$a -> id_razdel = 3;

$a ->name = “Новаязапись”;

$a ->cost = “200 000 руб.”;

$a -> save();

}

При вызове данного экшна выполнится запрос:

INSERT INTO products (id_razdel, name, cost) VALUES (3, “Новаязапись”,“200 000 руб.”);

UPDATE

UPDATE. Листинг 17.7

public function action_index() {

$a = ORM::factory(‘product’, 1);

$a ->name = “Новаязапись”;

$a -> save();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]