Skip to content
Anton edited this page May 14, 2015 · 6 revisions

Описание

Статический класс, хранящий описания связей в БД

Использование

При инициализации любого 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);

TODO TBD

Предложение по реализации связей на уровне таблиц. Есть следующая структура БД:

| 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']);
    }
}

Clone this wiki locally