[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ORM в Zend
phpdreamer
Изучаю Zend Framework...
С Kohana было удобнее всего работать с БД через ORM модели, которые можно между собой связывать.
Например такая связь 1 ко многим между product и template через специальную таблицу template_items:

class Model_Template extends ORM
{
protected $_has_many = array('products' => array(
'model' => 'product',
'through'=>'template_items'
));
...


В документации к ZF и всяких "getting started" предлагают работать через класс Zend_Db_Table, у которого даже есть связи http://framework.zend.com/manual/en/zend.d...ationships.html
С помощью этих связей можно (не проще чем через join) вытянуть данные из связанных таблиц, но все равно это не то... Нету таких функций как в ORM модуле Kohana:
	/**
* Tests if this object has a relationship to a different model,
* or an array of different models.
*
* // Check if $model has the login role
* $model->has('roles', ORM::factory('role', array('name' => 'login')));
* // Check for the login role if you know the roles.id is 5
* $model->has('roles', 5);
* // Check for all of the following roles
* $model->has('roles', array(1, 2, 3, 4));

*
@param string $alias Alias of the has_many "through" relationship
*
@param mixed $far_keys Related model, primary key, or an array of primary keys
*
@return Database_Result
*/

public function has($alias, $far_keys)
{
$far_keys = ($far_keys instanceof ORM) ? $far_keys->pk() : $far_keys;

// We need an array to simplify the logic
$far_keys = (array) $far_keys;

// Nothing to check if the model isn't loaded or we don't have any far_keys
if ( ! $far_keys OR ! $this->_loaded)
return FALSE;

$count = (int) DB::select(array('COUNT("*")', 'records_found'))
->
from($this->_has_many[$alias]['through'])
->
where($this->_has_many[$alias]['foreign_key'], '=', $this->pk())
->
where($this->_has_many[$alias]['far_key'], 'IN', $far_keys)
->
execute($this->_db)->get('records_found');

// Rows found need to match the rows searched
return $count === count($far_keys);
}

/**
* Adds a new relationship to between this model and another.
*
* // Add the login role using a model instance
* $model->add('roles', ORM::factory('role', array('name' => 'login')));
* // Add the login role if you know the roles.id is 5
* $model->add('roles', 5);
* // Add multiple roles (for example, from checkboxes on a form)
* $model->add('roles', array(1, 2, 3, 4));
*
*
@param string $alias Alias of the has_many "through" relationship
*
@param mixed $far_keys Related model, primary key, or an array of primary keys
*
@return ORM
*/

public function add($alias, $far_keys)
{
$far_keys = ($far_keys instanceof ORM) ? $far_keys->pk() : $far_keys;

$columns = array($this->_has_many[$alias]['foreign_key'], $this->_has_many[$alias]['far_key']);
$foreign_key = $this->pk();

$query = DB::insert($this->_has_many[$alias]['through'], $columns);

foreach ( (array) $far_keys as $key)
{
$query->values(array($foreign_key, $key));
}

$query->execute($this->_db);

return $this;
}

/**
* Removes a relationship between this model and another.
*
* // Remove a role using a model instance
* $model->remove('roles', ORM::factory('role', array('name' => 'login')));
* // Remove the role knowing the primary key
* $model->remove('roles', 5);
* // Remove multiple roles (for example, from checkboxes on a form)
* $model->remove('roles', array(1, 2, 3, 4));
* // Remove all related roles
* $model->remove('roles');
*
*
@param string $alias Alias of the has_many "through" relationship
*
@param mixed $far_keys Related model, primary key, or an array of primary keys
*
@return ORM
*/

public function remove($alias, $far_keys = NULL)
{
$far_keys = ($far_keys instanceof ORM) ? $far_keys->pk() : $far_keys;

$query = DB::delete($this->_has_many[$alias]['through'])
->
where($this->_has_many[$alias]['foreign_key'], '=', $this->pk());

if ($far_keys !== NULL)
{
// Remove all the relationships in the array
$query->where($this->_has_many[$alias]['far_key'], 'IN', (array) $far_keys);
}

$query->execute($this->_db);

return $this;
}

Остается вручную работать со связующими таблицами или самому расширять класс Zend_Db_Table...

А что на самом деле используют опытные Zend разработчики?
Модули какие или все таки Zend_Db_Table?
Есть какое-то общепринятое хорошее решение?





Спустя 9 минут, 54 секунды (29.12.2011 - 23:50) RCuPeR написал(а):
Так же интересует ответ.

Спустя 12 часов, 38 минут, 45 секунд (30.12.2011 - 12:29) phpdreamer написал(а):
Гугл подсказал что можно интегрировать Doctrine 2 или Doctrine 1 с Zend 1 или Zend 2...
Обратил внимание что Doctrine 2 использует пространства имен, а они (пруфлинк) поддерживаются начиная с php 5.3, то есть не будет работать на большинстве хостингов.
Сама Doctrine что-то меня не порадовала ни наличием русскоязычной документации (а читать там много), ни особой простотой работы через нее.
Возможно и буду использовать Doctrine, но не сразу.

Спустя 28 минут, 9 секунд (30.12.2011 - 12:57) Семён написал(а):
phpdreamer
Правильное решение.

Спустя 1 час, 54 минуты (30.12.2011 - 14:51) caballero написал(а):
ORM - это дополнительная и весьма громоздкая прослойка. В яве где есть долгоживущие объекты еще есть смысл. В PHP такое использовать неэфективно. Тем более что сложные запросы все равно придется писать руками иначе ORM сгенерит такой вареник что 90% времени на отработку чтраницы придется на ORM. Не говоря уже о том что нельзя будет использовать особенности синтаксиса конкретной БД.

Спустя 35 минут, 35 секунд (30.12.2011 - 15:27) vital написал(а):
ORM - зло.
Но как мне сказали на одной из прошлых работ - Железо дешевле разработчиков.
Да, там юзали ZF + Doctrine.

Спустя 30 минут, 36 секунд (30.12.2011 - 15:57) caballero написал(а):
Цитата (vital @ 30.12.2011 - 12:27)
ORM - зло.
Но как мне сказали на одной из прошлых работ - Железо дешевле разработчиков.
Да, там юзали ZF + Doctrine.

Таки да, Но не факт что ORM ускоряет разработку. Начинающим программерам может быть. Но мне гораздо проще и быстрее написaть SQL запрос в одну строку чем городить гроздь каких то объектов.


_____________
http://phpdreamer.ru
http://blog.phpdreamer.ru
http://php5shop.com
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.