Все про activerecord в версії yii 2

Клас ActiveRecord, що міститься в Yii, призначений для створення об'єктно-орієнтованого інтерфейсу для доступу до інформації, що зберігається базі даних. Подібні структури зараз можна знайти і в інших більш сучасних framework: Laravel, CodeIgniter, Smyfony і Ruby. Сьогодні ми зануримося в реалізацію версії Yii 2.0, і я покажу вам деякі найбільш корисні функції.

Модель класу інтро.

Yii ActiveRecord є вдосконаленою версією бази yii \ base \ Model (фундамент архітектури Model-View-Controller). Зараз я швидко поясню роботу найважливіших функцій, які ActiveRecord успадкував від класу Model:

Бізнес-дані зберігаються в атрибутах. Тут знаходяться екземпляри загальнодоступних моделей. Всі атрибути можуть призначатися масово: призначте будь-який масив в властивість моделі attributes. Це працює, тому що базовий клас Component (що є базовим у всій версії Yii 2.0) реалізує метод __set (). який в класі Model має іншу назву - setAttributes (). Теж саме стосується і вилучення: всі атрибути можуть бути вилучені при застосуванні властивості attributes. Знову ж і цей атрибут побудований на класі Component, який використовує __get (). тотожний атрибуту getAttributes () в класі Model.

Моделі так само постачають і атрибут мітки, яка використовується для відображення цілей, що полегшує процес використання їх в формах.

Дані, що передаються в модель користувальницького введення повинні піддаватися перевірці, щоб бачити: чи задовольняють вони вашу бізнес-логіку. Це можна зробити, уточнюючи rules (). в яких повинен міститися хоча б один або кілька атрибутів перевірки.

За замовчуванням, тільки атрибути, які мають статус «захищені» (це означає, що вони мають правилами перевірки, визначеними для них), можуть призначатися масово.

Сценарії дозволяють вам змінювати спосіб перевірки і обробки даних.

Створення моделі ActiveRecord.

Приклад моделі ActiveRecord є рядком в таблиці бази даних, тому нам потрібна база даних. У цій статті я буду використовувати дизайн бази даних саме такою, якою представлений нижче на зображенні як приклад. Це найпростіша структура, яку якраз і використовують в блогових постах. У Authors може бути кілька статей, які в свою чергу можуть мати кілька тегів (по суті ієрархічна система). Articles пов'язаний з тегами через зв'язок N: M, тому що ми хочемо продемонструвати зв'язок articles, засновану на тегах. На таблиці «Articles» ми зосередимо свою увагу, тому що саме вона має найбільш цікавим набором зв'язків.

Я використовував розширення Gii для створення моделі на основі бази даних і зв'язків в ній. Тут представлено те, що вийшло в таблиці Articles, створеної за структурою бази даних при натисканні всього пари клавіш:

Шматочок програми, представлений вище показує: які атрибути є доступними в кожному прикладі. Зауважте, що саме завдяки відносним розподілом (розподілів по класах), ви також можете використовувати властивості для пов'язаних даних: одне за допомогою Authors $ authors і безліч із застосуванням Articlestags [] $ articlestags.

Функція tableName () визначає яка з баз даних пов'язана з даною моделлю. Це дозволяє розділити ім'я класу від фактичного імені таблиці.

rules () визначає правила валідації моделі. Немає ніяких визначальних сценаріїв, існує тільки звід правил. Він досить читабельний; вказує на поля, які потрібні або на потрібне ціле число, рядок.

І на кінець функції getAuthors () і getArticlestags () визначають зв'язок цієї таблиці з іншими.

Замітка: «Я був украй здивований, дізнавшись, що атрибут 'Format' позбувся повністю властивостей, перевірки і ярлика. Виявляється, що Gii не підтримує ENUMs. Крім того, в MySQL тільки PostgreSQL підтримує його, і тому він так і не був реалізований. »

Завершення моделі.

Можливо ви побачили, що згенерований клас Articles володіє зв'язками, певними для зовнішнього ключа таблиці. Зв'язок N: M між Articles і Tags не може створюватися автоматично, тому нам доводиться робити це вручну.

Все зв'язку вже в якості примірників повертаються в yii \ db \ ActiveQuery. Щоб визначити зв'язок між Articles і Tags нам треба буде використовувати ArticlesTags як сполучною таблиці. У ActiveQuery це робиться шляхом визначення по таблиці. У ActiveQuery для цієї мети передбачено 2 методу, які ви можете використовувати:

• via () дозволяє використовувати вже наявні зв'язки, щоб визначити поточні;

• viaTable () допомагає визначити використання тієї чи іншої таблиці для існуючих зв'язків.

Метод via () дозволяє використовувати вже певні зв'язки в таблиці. У нашому прикладі, проте, таблиця ArticlesTags не містить ніякої важливої ​​на цей рахунок інформації, тому я використовую метод viaTable ().

Тепер, коли ми визначили всі зв'язки, ми можемо починати використовувати модель.

Використання моделі.

Я швидко створю деяку базу даних, заповнену вручну.

Варто зауважити, що вищевказаних код містить деякі припущення, які я зараз поясню:

• Результат логічного елемента save () не оцінюються. Це не раціонально, тому що Yii фактично спочатку буде викликати елемент validate () в клас, і тільки потім зберігати його в базі даних. INSERT в базі даних не повинен проводитися за правилами перевірки провалів.

• Ви могли помітити, що ID атрибути різних інстанцій використовуються, поки не є заданими. Це може бути безпечним, тому що save () викликає дані INSERT і отримує призначення первинного ключа назад з бази даних і робить значення властивостей ID допустимими.

• $ article-> LastEdited це значення DateTime в базі даних. Я хочу вставити поточну дату і час, викликаючи для цього функцію NOW () в SQL. Ви можете зробити це, використовуючи клас Expression, який дозволяє застосовувати різні SQL виразу з ActiveRecord екземплярами.

Ви можете потім витягти ще раз статтю з бази даних:

Нові та Розширені функції.

Раніше була представлена ​​ще не вся інформація про Yii ActiveRecord. Давайте зробимо розповідь ще більш цікавим і розглянемо новітні і змінені функції версії Yii 2.0.

Yii 2.0 має можливість виявляти змінені атрибути. У ActiveRecord це називається «брудні» атрибути, тому що вони потребують оновлення бази даних. Ця здатність за замовчуванням дозволяє вам побачити, які з атрибутів змінилися в моделі, і діяти виходячи з цих даних. Коли, наприклад, ви масово привласнюєте всі атрибути з форми POST, але хочете вибрати з них тільки змінені, робіть так:

ActiveRecord, будучи розширенням Model. реалізує межу \ yii \ base \ Arrayable з її методом toArray (). Завдяки цьому ви можете швидко перетворювати модель з атрибутами в масив. Також існують і ще деякі приємні доповнення.

Зазвичай при виклику методу toArray () викликає і функція fields (). яка перетворює заданий шматок програми в масив. Опціонально розгорнутий параметр toArray () буде додатково викликати елемент extraFields (). диктує, які поля будуть також включені.

Ці два методи групи field реалізуються через BaseActiveRecord. але ви можете реалізовувати їх у своїй моделb, налаштовуючи вихід до методу toArray ().

У моєму прикладі я б хотів, щоб розширений масив містив всі теги статті, розділені комою:

А потім отримати масив з усіма полями:

Версія Yii 1.1 вже реалізувала деякі події в CActiveRecord. які збереглися і в версії Yii 2.0. Функціонуючий цикл ActiveRecord в керівництві Yii 2.0 дуже добре демонструє запуск події при використанні ActiveRecord. Всі ці події запускаються оточуючими нормальними діями вашого ActiveRecord примірника. Назви таких подій досить очевидні, тому ви зможете з'ясувати, коли вони запускаються: afterFind (), beforeValidate (), afterValidate (), beforeSave (), afterSave (), beforeDelete (), afterDelete ().

У моєму прикладі атрибут LastEdited є підходящим для того, щоб продемонструвати використання події. Я хочу переконатися, що LastEdited завжди відображає останні зміни статті. Я можу розподілити це між двома подіями: beforeSave () і beforeValidate (). Моя модель відображає LastEdited як обов'язковий атрибут, тому нам знадобиться використовувати подія beforeValidate (). щоб переконатися, що він є і в новому екземплярі моделі.

Зауважте, що працюючи з усіма цими подіями, ви повинні викликати батьківського обробника подій. Повертатиметься значення false (або нічого) в події функції, поки дія не перестане відбуватися.

Behavior може служити для збільшення функціональності існуючих компонентів без модифікування їх кодів. Він також може реагувати на подію в компоненті, до якого був прикріплений. В Yii 2.0 існує набір доступних варіантів behavior:

• yii \ behaviors \ AttributeBehavior дозволяє вказувати на атрибути, які потребують оновлення. Наприклад, ви можете встановити значення атрибута, засноване на неназваною функції події BEFORE_INSERT;

• yii \ behaviors \ BlameableBehavior робить саме те, що ви і пропонували: звинувачує когось. Ви можете поставити 2 атрибута: createdByAttribute і updatedByAttribute. які будуть встановлюватися для поточного користувача ID при створенні або оновленні об'єкта;

• yii \ behaviors \ SluggableBehavior дозволяє автоматично створювати URL на основі одного з атрибутів для іншого;

• yii \ behaviors \ TimestampBehavior дозволить вам автоматично створювати або оновлювати тимчасові мітки в createdAtAttribute і updatedAtAttribute.

Остання риса, яку я хочу торкнутися полягає в можливості автоматично використовувати транзакції в моделі. Із застосуванням зовнішніх ключів також приходить можливість на запити до бази даних, через що іноді відбувається збій. Але за допомогою транзакції даної проблеми можна уникнути. Yii дозволяє вам вказувати операції, які повинні пройти транзакцію за допомогою функції transactions (). Зверніть увагу, що вам доведеться повернути правило для SCENARIO_DEFAULT. якщо ви хочете щоб дана операція виконувалася за замовчуванням:

висновок:

Теги: версія Yii 2.0, ActiveRecord, основні функції ActiveRecord

Схожі статті