1

Тема: Зв’язки між моделями

Всім привіт. Розробив систему зв’язків між моделями. Якщо описати кодом тоді це так виглядає:

# Вибираємо користувача під номером 1
$user = \App\Users\Table::instance()->fetchOne(1);

# Виводимо дату реєстрації паспорту який належить користувачу 1
echo $user->passport->registrationDate;

У даному випадку ми не реалізуємо метод отримання passport ми просто описуємо звязок.

namespace \App\Office\Users;
class Table extends \Uc\Db\Table {

  public function relations(){
    return array(
     'passport'=>array(
       'type'=>static::RELATIONS_HAS_ONE,
       'table'=>\App\Passport\Table::N,
       'foreignField'=>'passport_id',
     )
    );
  }

}

Мене цікавить чи я все правильно зробив і чи буде зручно користуватись такими штуками.

Якщо можете прочитайте https://github.com/ukrcms/ukrcms/blob/m … lations.md і скажіть чи ви зрозуміли як реалізувати зв’язки чи ні  ;)

Наперед дякую ;)

p.s. Цю тему піднімаю так як не знаю чи робити рефакторинг і перейменовувати назви ключів чи залишати такі як є і інше.

2

Re: Зв’язки між моделями

Почав дивитися і...
На першій зв'язці застряг (можливо варто було б у код заглянути:) )
Яким чином задається зв'язка, у двох моделях вказується pasport_id (поле із users) і в жодній не вказано до якого поля конектитись в таблиці паспорта, чи я щось не так зрозумів?

3

Re: Зв’язки між моделями

'table'=>\App\Passport\Table::N

а чому б не просто вказати модель?)

4

Re: Зв’язки між моделями

Почав дивитися і...
На першій зв'язці застряг (можливо варто було б у код заглянути:) )
Яким чином задається зв'язка, у двох моделях вказується pasport_id (поле із users) і в жодній не вказано до якого поля конектитись в таблиці паспорта, чи я щось не так зрозумів?

Ось як відбувається процес:
1. у нашій базі даних створюємо дві таблиці, для прикладу uc_posts i uc_categories
2. У таблиці uc_posts створюємо поле category_id
3. Створюємо 4 класи:
- Posts\Table
- Posts\Model
- Categories\Table
- Categories\Model
У класі Posts\Table додаємо метод

public function relations(){
 return array(
  'category'=>array(
    'type'=>static::RELATIONS_HAS_ONE,
    'table'=>\App\Categories\Table::N,
    'myField'=>'category_id',
  )
 );
}
 

Тепер коли з бази ми витягнемо пост ми можемо отримати його категорію звертаючись до властивості category


    # Вибираємо перший пост
    $post = \App\Posts\Table::instance()->fetchOne(1);
     
    # Виводимо заголовок категорії в якому знаходиться пост 1
    echo $post->category->title;


'table'=>\App\Passport\Table::N
а чому б не просто вказати модель?)

По-перше отримання моделей відбувається через клас Таблиці
По друге існує ще одна фішка в даній реалізації: джоїни

Для прикладу нам потрібно отримати всіх користувачів які зареєстрували паспорти за останні 24 години
Якщо задамо зв’язки у таблиці користувачів код буде наступний:

$usersTable = \App\Users\Table::instance();
$select = $usersTable->select();
$select->joinWithPassport()->registration_dateGt(time()-24*3600);

$users = $usersTable->fetchAll($select);

На даному етапі у нас моделей ще не існує але зв’язки уже необхідні ;)

# Повертає селект таблиці паспортів
$select->joinWithPassport()

Отже така штука.
Скоріш за все я поміняю назви ключів myField i foreignField для зв’язків один до одного і один до багатьох так як трохи плутається що де вписувати. Це сама найбільша дилема: міняти чи не міняти

Постараюсь найближчим часом зробити скрінкаст або описати реалізацію в документації.

Фактично такий спосіб задання зв’язків класний, так як дозволяє реалізувати вибірки з бази без написання джоінів і без замислення по яких полях треба об’єднувати таблиці і інше.