-
Notifications
You must be signed in to change notification settings - Fork 37
Db Relations
Статический класс, хранящий описания связей в БД
При инициализации любого Db\Table класса в классе Relations добавляется запись о привязки модели к классу:
Db\Relations::$relations[
'Model' => '\Applications\Model\Table',
'Users' => '\Applications\Users\Table'
];Далее необходимо инициировать связи в классе Table который вы будете использовать:
namespace Application\Pages;
use \Bluz\Db\Relations;
class Table extends \Bluz\Db\Table
{
public function init() {
// one to many relation
Relations::setRelation('Pages', 'userId', 'Users', 'id');
}
}Всё, можно использовать:
namespace Application;
/* @var Pages\Row */
$page = Pages\Table::findRow($id);
$user = $page->getRelation('Users');
// page owner login
echo $user->login;
$pages = $user->getRelations('Pages');
// pages of user
echo sizeof($pages);Предложение по реализации связей на уровне таблиц. Есть следующая структура БД:
| users | | posts | | posts_tags | | tags |
| id | | id | | postId | | id |
| name | | title | | tagId | | name |
| userId |
Структура хранения связей:
// high level links
array(
'users' => ['posts'],
'posts' => ['users', 'posts_tags', 'tags'],
);
// low level links
array(
'users:posts' => ['id' => 'userId'],
'posts:users' => ['userId' => 'id'],
'posts:posts_tags' => ['id' => 'postId'],
'tags:posts_tags' => ['id' => 'tagId'],
'posts:tags' => ['posts:posts_tags', 'tags:posts_tags'],
)Пример вытягивание связи posts:tags:
$tags = $post->getRelation('tags');
// inside
$relation = 'posts:tags';
if (array_key_exists($relation, Table::$relations)) { };
if (sizeof(Table::$relations[$relation]) > 1) {
// many to many
foreach (Table::$relations[$relation] as $relationLink) {
// ... build query
}
} elseif (sizeof(Table::$relations[$relation]) == 1) {
// many to one
// ... build query
}Инициализация связей в конкретных сущностях таблиц:
namespace Application\Users;
/**
* @property $id
* @property $name
*/
class Row extends \Bluz\Db\Row {
}
class Table extends \Bluz\Db\Table {
protected $table = 'users'; // can retrieve from NS
protected $primary = ['id']; // can retrieve from DB info
}
namespace Application\Posts;
/**
* @property $id
* @property $title
* @property $userId
*/
class Row extends \Bluz\Db\Row {
/* can be "magic" */
public function getUser() {
return $this->getRelation('users');
}
/* can be "magic" */
public function getTags() {
return $this->getRelation('tags');
}
}
class Table extends \Bluz\Db\Table {
/* manyToOne */
public function init()
{
// to another table
// field, table => foreighKey
$this->toOne('userId', ['users' => 'id']);
// many to many over third table
// field, table => foreighKey, table => foreignKey, table => foreighKey
$this->toMany('id', ['posts_tags' => 'postId'], ['posts_tags' => 'tagId'], ['tags' => 'id']);
}
}
namespace Application\Tags;
/**
* @property $id
* @property $name
*/
class Row extends \Bluz\Db\Row {
}
class Table extends \Bluz\Db\Table {
/* manyToOne */
public function init()
{
$this->toMany('id', ['posts_tags' => 'tagId'], ['posts_tags' => 'postId'], ['posts' => 'id']);
}
}Acl
Application
Auth
Cache
Common
— Exception
— Collection
— Container
— Helper
— Options
— Singleton
Config
Controller
— Data
— Mapper
—— Crud
—— Rest
— Reflection
Crud
— Crud Table
Db
— Row
— Table
— Relations
— Query
Debug
EventManager
Grid
Http
Layout
Logger
Mailer
Messages
Nil
Proxy
Registry
Request
Response
Router
Session
Translator
Validator
View