Здравствуйте, я новичок в изучении фреймфорка и накопился уже целый ряд вопросов, на которые я не могу нигде найти ответ. Нужно реализовать триггер(логгер) не знаю как правильно назвать... Имеется Laravel 5.4, php 5.6.4, mssql 2008, iis 7.5, win server 2008 r2. Например: есть таблица "Model(Модель)" - "id", "name(наименование)"; есть таблица "Сhange_of_model(Изменение модели)" - "id", "old_id(id из таблицы Model)", "who_changed(кто изменил)", "when_changed(когда изменил)","type_of_change(тип изменения-insert, create, delete)". Не понимаю как это организовать в Laravel. Может кто-нибудь сможет меня подтолкнуть в нужном направлении или поделиться ссылкой на ресурс, где это подробно объясняют на каком-нибудь живом примере. P.S. бегло просмотрел конструктор-запросов и Eloquent но мало что пока для себя понял. Создал в БД 2 таблицы и прописал это в файле миграции public function up() { DB::unprepared(' CREATE TRIGGER 'Сhange_of_model_trigger' ON models AFTER INSERT AS INSERT INTO Сhange_of_model(old_id, who_changed, when_changed, type_changed, name) SELECT id, @uname, GETDATE(), 'insert', name FROM INSERTED'); } --выдает ошибки и предчувствие, что это в корне не правильный подход к решению. Подскажите пожалуйста в каком направлении двигаться. Или помогите разобраться на примере этих двух таблиц. Заранее очень благодарен.
Тебе именно нужно в mysql триггер? Просто если я правильно понял можно еще сделать в самом Laravel через провайдер чтобы перед CRUD действиями мы допустим добавили данные в другу таблицу в методе boot PHP: public function boot() { // if new comment was created Comment::created(function($comment){ //do smth } }); } Если нужно могу подробнее рассказать
Про миграции я прочитал и не нашел там ничего по поводу ведения изменений, можете меня поправить и привести конкретный пример где говорится про миграции и изменение данных в бд --- Добавлено --- Я бы не отказался от подробного объяснения, если не сложно. Единственное не mysql а mssql но это не важно мне главное понять как реализовать хранение изменений в бд. т.е. например я создал новую модель и при создании у меня в таблице где хранятся логи появится запись что такой то создал то то, затем я зашел переименовал модель и у меня в таблице изменений появилась вторая строка такой изменил то то. Мне сказали вручную создать в бд тригеры и не парится, но получается что я все таблицы создал через миграции т.е. при переносе на прод. мне будет достаточно php artisan migrate чтобы развернуть базу, а если я создам вручную эти тригеры в базе, то мне придется их вручную создавать и в проде что на мой взгляд не совсем практично. Поэтому я и задался вопросом как в laravel сделать некое подобие этого триггера или логгера чтобы в бд хранить эти изменения. Посоветовали также зацепится за save но опять же я несовсем понимаю как это будет отрабатывать на практике.
@Feonix89, https://laravel.com/docs/master/eloquent#observers Перехватываешь события, и делаешь, что нужно.
Смотрите а насколько такой подход правильный если смотреть пакетную загрузку большого количества строк? т.е. если я буду загружать в систему 1000 моделей например. Насколько я понял если делать через observer то на каждую строку получится 3 запроса а если делать через sql триггер то 1. Возможно, что я понял не правильно. И вопрос еще такого характера когда я делаю миграцию и создаю таблицу все нормально, а когда делаю create trigger идут ошибки как в первом вопросе, т.е. ругается на само create trigger возможно есть способ через миграции создать триггер в sql?
Собственно через миграцию получилось создать таким образом: (для MS SQL) PHP: <?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AddTrigger extends Migration { public function up() { DB::unprepared("CREATE TRIGGER add_model ON [models_logger_trigger] AFTER INSERT AS BEGIN insert into [models_logger_trigger] (table_id,when_changed,type_of_change) select a.[id] [table_id], GETDATE() [when_changed], 'insert' [type_of_change] from inserted a left join deleted b on b.[id]=a.[id] where b.id is null END"); } /** * Reverse the migrations. * * @return void */ public function down() { DB::unprepared("DROP TRIGGER add_model"); } }