Oct 4 2014
Yii2 создание блога (Часть 2 – проектирование БД, CRUD)
В этой статье будет освещено создание таблиц в БД и создание моделей необходимых для дальнейшей работы.
Для начала создадим три таблицы:
Категории блога:
CREATE TABLE `tbl_category` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Пользователи блога, они же авторы:
CREATE TABLE `tbl_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `login` varchar(40) NOT NULL, `password` varchar(100) NOT NULL, `email` varchar(100) NOT NULL, `nickname` varchar(255) NOT NULL, `about` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Посты блога:
CREATE TABLE `tbl_post` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `anons` text, `content` mediumtext, `category_id` int(10) unsigned DEFAULT NULL, `author_id` int(10) unsigned DEFAULT NULL, `publish_status` enum('draft','publish') NOT NULL DEFAULT 'draft', `publish_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), CONSTRAINT `FK_post_category` FOREIGN KEY (`category_id`) REFERENCES `tbl_category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `FK_post_author` FOREIGN KEY (`author_id`) REFERENCES `tbl_user` (`id`) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
База данных готова, переходим к созданию моделей. В этом нам поможет Yii code generator: http://localhost/index.php?r=gii
После перехода в Yii code generator выбираем раздел “Model generator”. В открывшейся форме выставляем опцию использования префикса таблиц: “Use Table Prefix”. В поля “Table Name” и “Model Class” поочерёдно вводим имена таблиц и имена генерируемых классов и жмите кнопку генерировать:
tbl_category: Category tbl_user: User tbl_post: Post
Note: во время генерации модели User перезапишите имеющийся файл User.php
На выходе генератора получаем классы представляющие модели для таблиц в БД.
После того, как модели готовы переходим к CRUD (Create, Read, Update, Delete) generator’у. Он поможет в создании базовых контроллеров и представлений CRUD интерфейса. Здесь нам потребуется заполнить два поля “Model Class” и “Controller Class”. В “Model Class” вписываем имя модели (с указанием namespace) для которой будем генерировать CRUD. В “Controller Class” вписываем имя генерируемого контроллера (с указанием namespace). Например для постов это выглядит следующим образом:
"Model Class": app\models\Post "Controller Class": app\controllers\PostController
Просмотреть результат, например для пользователей, можно перейдя по адресу http://localhost/index.php?r=user
MrLeo
Nov 29, 2014 @ 10:58:21
делаю все по инструкции, но при переходе http://localhost/index.php?r=user появляется страница, что ее не существует
Georgy Spack
Nov 29, 2014 @ 12:53:27
Вероятней всего не сгенерировали CRUD или сгенерировали не правильно.
MrLeo
Nov 29, 2014 @ 11:00:37
(Note: во время генерации модели User перезапишите имеющийся файл User.php)
и где может находиться этот файл, чтобы была возможность ее изменить
Georgy Spack
Nov 29, 2014 @ 12:52:15
Вторая часть построена исходя из условия, что вы сделали первую часть, т.е. развернули yiisoft/yii2-app-basic, тогда при генерации модели User GII предложет перезаписать уже имеющуюся модель User, а так же укажет её месторасположение.
Александр
Dec 10, 2014 @ 00:47:31
Более правильный подход, создавать таблицы используя миграции Yii.
Georgy Spack
Dec 10, 2014 @ 01:42:02
Согласен, миграции используются начиная с часть 6 и более подробно описаны в статье про миграции.
TM
Feb 18, 2015 @ 13:05:57
Замечание
все это проделывать стоит предварительно НЕ залогинившись на сайте
иначе можно отхватить fatal error Call to undefined method app\models\User::findIdentity() 🙁
Валерий
Mar 02, 2015 @ 14:59:57
Разве в ссылке http://localhost/index.php?r=user
в параметре r (роутинг) не нужно указывать название контроллера? который называется post, а не user
Georgy Spack
Mar 02, 2015 @ 19:47:34
В записи вида:
Подразумевается, что контроллер user, а экшн (action) index
Валерий
Mar 02, 2015 @ 20:00:30
“Controller Class”: app\controllers\PostController
Где тут контроллер с именем User создается?
Лично у меня тоже ошибка 404 на r=user
Georgy Spack
Mar 02, 2015 @ 23:13:12
Так там же и написано:
Просмотреть результат, НАПРИМЕР для пользователей, можно перейдя по адресу http://localhost/index.php?r=user
Соответственно для просмотра списка постов будет:
http://localhost/index.php?r=post
>“Controller Class”: app\controllers\PostController
>Где тут контроллер с именем User создается?
>Лично у меня тоже ошибка 404 на r=user
В тексте описано создание контроллера на основе постов, если бы вы создали и для пользователей тоже самое, смогли бы и пользователей поглядеть.
Валерий
Mar 03, 2015 @ 12:58:28
Спасибо за разъяснение, теперь понятно! А то в статье этого нет, было указано что создать надо контроллер для постов, а почему то смотреть надо юзеров, ни слова о о том, что контроллер юзеров неплохо бы создать тоже.
Сергей
Mar 30, 2015 @ 22:53:47
Все делал по инструкции, выдает ошибку: Call to undefined method app\models\User::findIdentity() . Все что знал перепробовал. Порекомендуйте что нибудь. Все контроллеры, модели и представления сгенерировал.
Georgy Spack
Mar 31, 2015 @ 08:41:12
Проверьте наличие статического метода findIdentity() в классе app\models\User. Вероятней всего он отсутствует.
Сергей
Mar 31, 2015 @ 17:25:52
Да, метод действительно отсутствовал, скопировал:
public static function findIdentity($id)
{
return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
}
Пишет: Access to undeclared static property: app\models\User::$users
Написал: private static $users = [
‘100’ => [
‘id’ => ‘100’,
‘username’ => ‘admin’,
‘password’ => ‘admin’,
‘authKey’ => ‘test100key’,
‘accessToken’ => ‘100-token’,
],
‘101’ => [
‘id’ => ‘101’,
‘username’ => ‘demo’,
‘password’ => ‘demo’,
‘authKey’ => ‘test101key’,
‘accessToken’ => ‘101-token’,
],
];
Все равно чем то недоволен. Где то я что то не так сгенерировал.
Georgy Spack
Apr 01, 2015 @ 08:32:56
Вы код в каком-нибудь репозитории размещаете? Если да, киньте ссылку – гляну.
> Все равно чем то недоволен.
Так сложно сказать, в чём проблема.
Александр
Dec 21, 2015 @ 16:42:31
Дико извиняюсь – как правильно растолковать этот запрос:
CONSTRAINT `FK_post_category` FOREIGN KEY (`category_id`) REFERENCES `tbl_category` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `FK_post_author` FOREIGN KEY (`author_id`) REFERENCES `tbl_user` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
???
Александр
Dec 21, 2015 @ 17:31:53
не совсем понятна конструкция CONSTRAINT `FK_post_category` – зачем она???
– присвоение внешнего ключа уже разобрался.
Georgy Spack
Dec 22, 2015 @ 10:51:46
CONSTRAINT `FK_post_category` – эта инструкция задаёт имя внешнего ключа и индекса равными `FK_post_category`.
Александр
Dec 23, 2015 @ 09:03:37
Спасибо
Александр
Feb 20, 2017 @ 19:40:08
При создании CRUD ругается ‘app\models\User’ must extend from yii\db\BaseActiveRecord or its child class.