За последние 24 часа нас посетили 22847 программистов и 1262 робота. Сейчас ищут 812 программистов ...

Как организовать историю изменений таблицы в БД?

Тема в разделе "Laravel", создана пользователем Feonix89, 30 май 2018.

  1. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Здравствуйте, я новичок в изучении фреймфорка и накопился уже целый ряд вопросов, на которые я не могу нигде найти ответ.

    Нужно реализовать триггер(логгер) не знаю как правильно назвать...

    Имеется 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');
    }

    --выдает ошибки и предчувствие, что это в корне не правильный подход к решению.

    Подскажите пожалуйста в каком направлении двигаться. Или помогите разобраться на примере этих двух таблиц. Заранее очень благодарен.
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
  3. S_t_e_e_p

    S_t_e_e_p Активный пользователь

    С нами с:
    12 июл 2012
    Сообщения:
    181
    Симпатии:
    4
    Тебе именно нужно в mysql триггер?
    Просто если я правильно понял можно еще сделать в самом Laravel через провайдер чтобы перед CRUD действиями мы допустим добавили данные в другу таблицу

    в методе boot

    PHP:
    1.  public function boot()
    2.     {
    3.         // if new comment was created
    4.         Comment::created(function($comment){
    5.             //do smth
    6.             }
    7.         });
    8.     }
    Если нужно могу подробнее рассказать
     
    #3 S_t_e_e_p, 30 май 2018
    Последнее редактирование: 30 май 2018
  4. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Про миграции я прочитал и не нашел там ничего по поводу ведения изменений, можете меня поправить и привести конкретный пример где говорится про миграции и изменение данных в бд
    --- Добавлено ---
    Я бы не отказался от подробного объяснения, если не сложно. Единственное не mysql а mssql но это не важно мне главное понять как реализовать хранение изменений в бд. т.е. например я создал новую модель и при создании у меня в таблице где хранятся логи появится запись что такой то создал то то, затем я зашел переименовал модель и у меня в таблице изменений появилась вторая строка такой изменил то то. Мне сказали вручную создать в бд тригеры и не парится, но получается что я все таблицы создал через миграции т.е. при переносе на прод. мне будет достаточно php artisan migrate чтобы развернуть базу, а если я создам вручную эти тригеры в базе, то мне придется их вручную создавать и в проде что на мой взгляд не совсем практично. Поэтому я и задался вопросом как в laravel сделать некое подобие этого триггера или логгера чтобы в бд хранить эти изменения. Посоветовали также зацепится за save но опять же я несовсем понимаю как это будет отрабатывать на практике.
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
  6. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Смотрите а насколько такой подход правильный если смотреть пакетную загрузку большого количества строк? т.е. если я буду загружать в систему 1000 моделей например. Насколько я понял если делать через observer то на каждую строку получится 3 запроса а если делать через sql триггер то 1. Возможно, что я понял не правильно. И вопрос еще такого характера когда я делаю миграцию и создаю таблицу все нормально, а когда делаю create trigger идут ошибки как в первом вопросе, т.е. ругается на само create trigger возможно есть способ через миграции создать триггер в sql?
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    А какая ошибка? Что пишется конкретно?
     
  8. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Собственно через миграцию получилось создать таким образом: (для MS SQL)
    PHP:
    1. <?php
    2.  
    3. use Illuminate\Support\Facades\Schema;
    4. use Illuminate\Database\Schema\Blueprint;
    5. use Illuminate\Database\Migrations\Migration;
    6.  
    7. class AddTrigger extends Migration
    8. {
    9.     public function up()
    10.     {
    11.         DB::unprepared("CREATE TRIGGER add_model
    12.            ON [models_logger_trigger]
    13.            AFTER INSERT
    14.            AS
    15.            BEGIN
    16.                insert into [models_logger_trigger] (table_id,when_changed,type_of_change)
    17.                select
    18.                a.[id] [table_id],
    19.                GETDATE() [when_changed],
    20.                'insert' [type_of_change]
    21.                from inserted a
    22.                left join deleted b
    23.                on b.[id]=a.[id]
    24.                where b.id is null
    25.                END");
    26.     }
    27.  
    28.     /**
    29.      * Reverse the migrations.
    30.      *
    31.      * @return void
    32.      */
    33.     public function down()
    34.     {
    35.         DB::unprepared("DROP TRIGGER add_model");
    36.     }
    37. }
     
    #8 Feonix89, 31 май 2018
    Последнее редактирование модератором: 31 май 2018