Обучение — Не сохраняет строки в бд Yii2


Содержание

Yii2 save () создание строки БД со значениями по умолчанию

Я пытаюсь реализовать метод входа в систему с использованием OpenID, и переменные $ _SESSION публикуются правильно — и через них я просто пытаюсь зарегистрировать пользователей в MySQL. По какой-то причине при прохождении действия ‘login’ в моем контроллере ::

РЕДАКТИРОВАТЬ: Вот класс UserRecord, забыл добавить его в.

Результатом является просто опубликованная строка, в которую не введены никакие данные.

Любая помощь будет принята с благодарностью, спасибо.

Решение

Если вы переопределили одно и то же имя столбцов с помощью общедоступных переменных, они переопределяют переменные для activeRecord, а затем сохраняются только пустые значения.

Если это так, вы должны удалить (переопределенные) публичные переменные в вашей модели.

в противном случае, если у вас нет правил, то

Попробуйте добавить безопасный в атрибут в ваших правилах модели

Другие решения

Объявление «открытых» переменных заставило save () игнорировать публикуемые данные. Благодарю.

Работа с запросами в Yii 2.x. Добавление, изменение и удаление данных из таблицы (часть 4)

В заключительной статье по работе с запросами в Yii 2.x рассмотрим примеры добавления, изменения и удаления данных из таблицы. За основу берем таблицу Country (Страны) известную нам из предыдущих 3 статей. Таблица состоит из следующих полей: номер (id), название страны (name), количество жителей (number) и площадь (area).

Добавление данных в таблицу

Insert() или Save()

Insert(), save() осуществляют добавление данных в таблицу. Добавим в таблицу Country Англию.

Insert() при работе с DAO

Рассмотрим 2 способ добавления записи

batchInsert()

batchInsert() добавляет сразу несколько записей. Добавим в таблицу Country 2 страны Аргентину и китай

Изменение данных в таблице


Update() или Save()

update(), save() осуществляют изменения данных в таблице. Изменим численность населения в Китае

UpdateAll()

UpdateAll() — обновляет все записи. Сделаем количество всех жителей всех стран 1000000000

Update() при работе с DAO

Изменим численность жителей в России

Update с помощью SQL запроса

Приведем аналогичный пример только с помощью SQL запроса

Удаление данных из таблицы

Delete()

delete() удаляет данные из таблицы. Удалим Китай из таблицы Country.

Delete() при работе с DAO

Приведем второй способ

Delete() с параметрами

Удалим Аргентину и Англию

DeleteAll()

DeleteAll() удаляет все записи. Удалим все страны у которых на данный момент в таблице количество жителей равно 1000000000

Внимание: Таблица может иметь подчиненные таблицы, и тогда запрос на удаление записи или нескольких записей выдаст ошибку. Для решения проблемы необходимо изначально удалить все записи в подчиненной таблице, связанные с записью или записами во внешней таблице, а затем удалить запись во внешней таблице!

Yii2 — сохранение данных в связанные таблицы. Расширение yii2-save-relations-behavior.

Данное расширение используется для того, что бы при сохранении данных сущности (модели), например User:

происходило автоматическое сохранение данных во все связанные таблицы (вместо того, чтобы делать их сохранение вручную). Такой функционал доступен в Laravel-5 «из коробки», а в yii2, для этого, можно использовать специальное расширение: la-haute-societe/yii2-save-relations-behavior.


Особенности расширения:

  • поддерживаются отношения hasMany() и hasOne();
  • работает с существующими связанными объектами так и позволяет создавать новые;
  • поддерживаются составные первичные ключи;
  • используется только чистый Active Record API, поэтому работает с любым драйвером DB.

Установка:

Пример.

Например есть таблицы:
— users;
— user_networks;
Таблица users содержит данные пользователей, а таблица user_networks содержит данные соц.сетей к которым привязан каждый пользователь (название соц.сети и уникальный идентификатор данного пользователя). Т.е. связь один ко многим – один пользователь может быть зарегистрирован в нескольких соцсетях, при этом каждая строка таблицы user_networks может принадлежать только одному пользователю, т.к. она содержит его уникальный идентификатор.

Миграция для создания таблицы user_networks:

Далее создаем сущность(модель) для данной таблицы — Network. Класс ее должен наследоваться от ActiveRecord:

Если используется метод rules с правилами валидации, то нужно удалить проверку поля ‘user_id’ на обязательность заполнения, т.к. сохранением в это поле будет заниматься расширение.
Т.е. вместо
пишем

В основную сущность, в данном случае User, нужно добавить поведение для подключения класса расширения. Тогда данный класс будет следить за связанной таблицей (нужно указать в поведении) и сохранять в нее изменения при редактировании основной сущности.
Т.е. метод save нужно будет вызывать только для User, а данные в связанные с ним таблицы сохранятся автоматически.

Цукерберг рекомендует:  Вакансии Qoffee

В метод behaviors добавляем блок ‘saveRelations‘ и добавляем метод transactions что бы при записи в связанные таблицы с помощью этого поведения использовались транзакции:

Метод getNetworks связывает данную сущность с Network. По названию этого метода (с маленькой буквы и без префикса «get») в массив «relations» добавляем строку «networks». В массив ‘relations’ можно добавить несколько связанных сущностей и расширение за всеми ими будет следить и обновлять.

Использование.
  • При создании нового пользователя, сразу привязываем к нему таблицу с соцсетями (сущность Network). Для примера создаем новый объект Network. Данные сущности Network сохранятся при сохранении самой User, отдельно вызывать save не придется, кроме того, автоматически заполнится поле user_id.

  • Привязываем к User уже существующую сущность Network, по ее id (50):

Можно привязать сразу несколько сущностей по id используя массив:
или получить нужный объект другим образом:

Связь многие ко многим через связывающую таблицу.

На примере таблиц:

  • users;
  • roles (поля: id, name);
  • user_role (поля: user_id, role_id)

В реальном проекте для таблицы roles создаем уникальный ключ для поля name, а для таблицы user_role создаем составной первичный ключ для обоих полей и ограничения внешних ключей для них.

В сущности User создаем метод для получения роли через связывающую таблицу таким образом:
его и прописываем в поведении:

Т.е. так же как и раньше. В результате сохранения сущности User будут сохранены данные и в таблицу user_role и в roles. В данном примере создается новая роль. Если нужно привязать к пользователю уже существующую:

Заполнение доп. полей для связывающей таблицы.
Так же есть возможность сохранить что-то дополнительно в связывающую таблицу. Например связывающая таблица user_role кроме полей user_id и role_id содержит поле description, которое не участвует в связях и не заполняется автоматически. Заполнение поля description задается при настройке поведения:

С помощью массива ‘extraColumns‘ указываем, что нужно заполнить поля для связывающей таблицы. Указывается анонимная функция, которой в качестве аргумента передается модель таблицы с которой осуществляется связь (roles). Когда создается новый объект связанной таблицы или получаем уже существующие данные:
она заполняется этими данными и их можно использовать, если они нужны для связывающей таблицы. В данном случае в поле ‘description‘ таблицы user_role сохранится значение «admin_desc».

Yii2 basic: Создаем контроллер, форму, делаем валидацию, миграцию, сохраняем в базу


В этой записи мы создадим форму, модель которая будет отвечать за проверку полей этой формы, воспользуемся миграцией и создадим новую таблицу с ее помощью, а так же научимся сохранять данные в базу в Yii2 basic.

Давайте создадим следующий функционал:

  • Добавлять новые автомобили (поля: название, марку, описание, дата создания и обновления)
  • Смотреть все добавленные автомобили с пагинацией (постраничный просмотр, например по 10 или 15 на страницу)
  • Изменять машины
  • Удалять машины

Создание ActiveRecord модели

Для начала, лучше всего создать модель, которая будет работать с базой данных.

Для этого нужно зайти в папку models и создать новый PHP файл. Назовем его Car :

Как видим класс Car заимствует все методы из класса ActiveRecord . ActiveRecord — помогает работать с базой данных, а конкретнее с таблицей cars , которая указана в статическом методе tableName() .

Сейчас этот класс бесполезен, потому что таблицу cars еще предстоит создать.

Сделать это можно двумя способами:

  1. Через phpMyAdmin
  2. Через миграции (лучший вариант)

Почему миграции лучше, я уже ранее описывал в этом курсе, если вы внимательно его читали. Ниже как раз секция о том, как это сделать с помощью миграций.

Создание новой таблицы, используем миграции

Давайте для начала создадим миграцию новой таблицы и назовем её — cars .

Зайдите в корневую папку проекта:

И напишите следующее:

Где «create_cars_table» — это название миграции.

С помощью команды migrate/create вы указываете yii, что хотите создать новую миграцию.

Полный список доступных команды вы можете посмотреть написав $ php yii и нажав «Enter».

В ответ у вас выведется следующее:


Вам нужно ввести «yes» и нажать «Enter».

После чего у вас должна создаться папка migrations , в которой появится новый файл с названием похожий на этот — m170825_174453_create_cars_table.php . Я написал «похожий», потому что часть «m170825_174453» будет различаться в зависимости от времени когда создавалась миграция.

«m170825_174453» можно расшифровать следующим образом — «m _ ».

Файл m170825_174453_create_cars_table должен выглядеть следующее образом:

Метод up() используется для того, чтобы что-то изменять в базе вперед. То есть вы добавите новую таблицу, колонку, измените тип колонки и др.

Метод down() возвращает изменения, которые были сделаны в up() . То есть down() — это up() в обратную сторону.

Эти два метода нужны для того, чтобы мы могли спокойно создать новую миграцию и если вас что-то не устроит в ней, использовать метод down() и вернуться обратно.

Yii2 знает о стандартный вариантам создания миграций, поэтому когда вы пишите «created_<название_таблицы>_table», то он понимает, что вы хотите создать новую таблицу и заранее подготавливает файл для этого, собственно как вы и можете видеть выше.

Но это не значит, что вся работа будет сделано за нас. Теперь нам нужно дописать дополнительные колонки для таблицы.

В конечном итоге из миграции выше, нам нужно изменить только метод up() , который отвечает за создание:

  • $this->string() означает, что поле будет строкой
  • $this->primaryKey() — что поле будет уникальным ключом числового типа
  • $this->integer() сделает поле числовым

Как параметр вы можете указать длину для $this->string() или $this->integer() , а так же многих других методов помощников. В примере выше это 255 и 500. Так же, можно указать null() или notNull() — это разрешить полю быть NULL или нет.

Теперь если вы введете в корне проекта:

Вы увидите следующее сообщение:

Сообщение «Total 1 new migration to be applied:» означает, что у вас есть новые миграции, которые еще не были активированы и ниже список названий. Чтобы их запустить, вам нужно ввести «yes» и нажать «Enter».

Если все окей, у вас покажет следующее сообщение:

Большая его часть будет зеленым.

Теперь вы можете зайти в phpMyAdmin, в базу yii_loc и проверить наличие таблицы cars , выглядит это все примерно следующим образом:

Создание контроллера, экшена и использование модели

Создадим новый контроллер в папку controllers и назовем его CarController:

Теперь создадим action create , который будет отвечать за добавление новой машины.


Теперь добавим все элементы этого action, новые строки выделы ниже:

Внутри, нам нужно использовать модель Cars , которая будет проверять форму и возвращать ответ в шаблон create.php , который находиться в views/car/ .

Для правильного отображения шаблонов контроллера, во views нужно создать папку car , и внутри создать файл create.php .

Чтобы не париться по поводу создания create.php , скопируйте все из views/site/login.php и подправьте код под. У вас должно получиться что-то похожее на это:

Для создания формы лучше всегда использовать класс ActiveForm , потому что он заботится о безопасности, создавая скрытое поле с CSRF токеном и другие удобности в виде авто генерации полей формы, валидация и другой. У ActiveForm есть открывающийся формат и закрывающийся. Между ними пишутся элементы формы для ввода информации и, конечно же, кнопка отправки формы.

Обратите внимание на $this->title — этот атрибут задает название страницы в .

Так же посмотрите на:

Эта строка создает хлебные крошки, которые появятся автоматически над вашим шаблоном. А как название для хлебной крошки, мы так же используем $this->title , которые уже указали выше.

Пример элемента формы:

Этот элемент означает, что вы хотите создать обычный текстовый элемент формы, который равен следующему HTML:

Метод textarea() равен элементу соответственно.

Обратите внимание, что название полей в форме точно такие же как названия колонок в таблице cars в базе данных. Это не случайно — они должны совпадать.

Вы уже можете зайти на car/create и посмотреть на форму, которую вы только что сами создали. Пока что она работает только на половину, не добавляя в базу именно те данные, которые вы напишите. Все поля будут пустыми.

Для того, чтобы все было как надо, вам нужно добавить правила проверки полей в класс Car .

Заходим в models/Car.php и меняем его следующим образом:

Добавились два новых метода: rules() и behaviors() . Оба метода перезаписываются из ActiveRecord .

  • rules() — это правила проверки полей формы. Самое первое правило — указывает на то, что поля name и model являются обязательными для заполнения, второе — что мы чистим поля name , model и description от лишних пробелов с помощью trim , третье — длинна строки для полей name и model не должно превышать 255 символов используя ‘string’, ‘max’ => 255 , ну и четвертое правило — это почти повтор третьего, только длинна строки больше и все.
  • behaviors() — это поведение модели Car . Внутри может быть множество сценариев, но у нас будет только один — это TimestampBehavior . Этот класс отвечает за добавление дат при добавлении или обновлении информации (в данном случае о машине). То есть когда мы добавим новую машину, TimestampBehavior автоматически заполнит created_at и updated_at с нужной датой. При обновлении машины, он только обновим updated_at — как и должно быть.

Как установить подключение к БД в фреймворке Yii2

Простая и тривиальная задача с которой может столкнуться начинающий Yii2 разработчик. Начнем с того, что в зависимости от конфигурации проекта, БД может настраиваться по разному. Возьмем два варианта, которые предоставляет нам см фреймворк:

  1. basic (простой вариант)
  2. advanced (продвинутый вариант)


В обоих из вариантов, настройка БД (указание префикса/tablePrefix, имя/username, пароля/password, dsn и прочего) выполняется одинаково. Все зависит от месторасположения файла и «коннектор» класса работы с БД. В нашем примере мы будем рассматривать вариант взаимодействия с базой данных MySQL, как с одной из самых популярных.

Если брать basic, то конфигурационный файл подключения, можно найти по адресу — «/config/db.php».

С advanced вариантом, немного посложнее (на то он и продвинутый, т. е. для крупных проектов). Здесь может быть более одного файла настроек БД (для разделов — backend, frontend, пр.). Все зависит от того, как изначально вы сконфигурировали свое приложение. Так как админка и пользовательская часть зачастую взаимодействуют с одной базой, то файл настроек я обычно помещаю в каталог — «/common/config/db.php». А в конфиге «/common/config/main.php», прописываю доступ к выше упомянутому. Таким образом и в backend, и в frontend, подключение к БД автоматически «подтянется».

В обеих вариантах настройки идентичны и выглядят следующим образом:

Где:
class — класс-коннектор подключения к БД
dsn — хост (host) и название БД (dbname)
username — пользоватеь БД
password — пароль пользователя
charset — кодировка БД
tablePrefix — префикс таблиц (т. е. yii2 table prefix)

Не сохраняются в БД сообщения #2

Comments

Copy link Quote reply

GitFoxDev commented Sep 21, 2020

lowbase\sms\Sms::sendSms, 130 строка

Суть в том, что в данном методе, результатом
$result = $this->currentService->sendSms($phone, $text, $mustSentAt, $options);
является массив, в котором $result[‘id’] имеет тип как integer. А в модели установлена жесткая валидация, что значение provider_sms_id должно быть строкой и не более 255 символов.

Собственно валидация параметра provider_sms_id не проходит и соответственно SMS в БД не сохраняется.

Одно из решений, это когда мы обрабатываем результат отправки СМС и берем от туда ID сообщения, нужно принудительно перевести тип ID из int в string, например:

Как работать с событиями в момент соединения с БД в Yii2.

Автор: admin | 14 июня (Чт.) 2020г. в 11ч.37м.

События, о которых пойдет речь.

EVENT_AFTER_OPEN — событие, которое запускается после установления соединения с БД.

EVENT_BEGIN_TRANSACTION — событие, которое запускается непосредственно перед началом транзакции верхнего уровня.

EVENT_COMMIT_TRANSACTION — событие, которое запускается в момент завершения транзакции верхнего уровня.

EVENT_ROLLBACK_TRANSACTION — событие, которое запускается при откате транзакции верхнего уровня.

В расширенном шаблоне (advensed yii2) эти настройки нежат в файле по пути ./common/config/main-local.php
, а в basic yii2 в ./config/web.php


Тут оприделяются настройки соединения, такие как пароль и имя ползователя, кодировка, вид базы данных и другие.
yii\db\Connection представляет собой адаптер для соединения с базой данных через PDO.

События соединения с БД в yii2.

В классе yii\db\Connection есть четыре события, которые относятся к соединению с базой данных.
Названия этих событий хранят четыре константы класса:

EVENT_AFTER_OPEN.
EVENT_BEGIN_TRANSACTION.
EVENT_COMMIT_TRANSACTION.
EVENT_ROLLBACK_TRANSACTION.

Примеры использования событий соединения с БД в yii2.

Или создаем триггер на изменение каких-либо данных, исходя из условия (не важно какого, главное принцип написания кода):

Далее рассмотрим события транзакций на простом примере.

В приведенном примере назначается обработка событий транзакции в виде простого echo.
Далее, когда в процессе выполнения кода обработчики будут вызваны на экран, выведется
‘beginTransaction commitTransaction’. Ну а при возникновении исключения выведется ‘rollbackTransaction’.
$event->sender внутри обработчика события содержится соединение с базой данных (в данном случае!).

Эти события можно применить, например, если после удачного коммита нужно отправить сообщение
пользователю на почту об удачном действии (заказ товара в интернет-магазине) или что-то еще.

А если транзакция не удалась, сохранить важные данные, пришедшие, например с формы заказа и т.д.
В общем вариантов применения множество.

Приветствую!

Меня зовут Сергей. Я — автор этого блога.

Если Вам был полезен материал на моем сайте, поддержите пожалуйста мой проект, чтобы о нем узнали другие люди — кликните plizz :) на иконку в соц. сети, чтобы поделиться материалом с другими.

Модель формы Yii2 сохраняет NULL в БД

Поэтому, создавая простую форму, но когда я пытаюсь сохранить форму, она не сохраняет значения, а только NULL (это приведет к ошибке при изменении NULL в NOT NULL).

Также каждый раз, когда я его сохраняю, будет добавлена новая строка, но мне нужна только 1 строка, так как im сохраняет значения в 1 строке.

таблица db

контроллер

модель

Посмотреть

от вашей модели.


После этого добавьте поле activeon к вашему методу rules() . Поля, которые не существуют в методе rules() являются небезопасными и не будут обрабатываться. Добавьте там [‘activeon’, ‘save’] для тестирования, если он будет работать — измените его на правильную проверку.

Все это. ActiveRecord автоматически отображает столбцы из вашей таблицы. Если вы переопределите его — он будет неправильно обработан. Чтобы установить значения по умолчанию, вы должны использовать валидатор по default — Yii2 — средство проверки основных показателей по умолчанию

О нескольких сбережениях — вам нужно загрузить модель перед использованием $model->load() . Прямо сейчас вы создаете новую модель каждый раз, когда вы ее сохраняете.

Выборка, обновление и удаление записей

Настройка с базой данных

Настройки с базой данных указаны в файле config/ db.php .

Сначала надо создать модель для связи с базой данных, создав файл с именем таблицы в папке models/.

В контроллере данный файл подключается через код ниже:

Пример выборки записей.

Добавить запись можно через следующий код:

Обновить запись можно через следующий код:

Обновить несколько записей можно через метод updateAll() .

Метод updateAll() возвращает количество обновлённых записей.

Удаление записи происходит через метод delete() .

Удалить несколько записей можно через метод deleteAll() .

Метод deleteAll() возвращает количество удалённых записей.

Yii2 Session Storage в БД, слишком много строк? Представление?

Я только начал использовать yii\web\DbSession для хранения сеансов, моя текущая таблица содержит 33 000 строк.

Нужны ли мне все эти записи? Я использую их? Должен ли я настраивать какую-то реализацию, которая удаляет все старые записи?

Кажется, у вас большой проект, поэтому у вас много сеансов пользователей. Наличие большого стола, полного сеансов, не является проблемой. Компонент Yii DbSession имеет метод сбора gcSession (), который вызывается при каждом сохранении сеанса, и Yii автоматически заботится об истекших записях в таблице сеансов.

Так что да, вам нужны все они.

Если замедляется ваше приложение, вам может понадобиться настроить СУБД. Существует хороший ответ с полезными ссылками: оптимизация MySQL огромной таблицы

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих