За последние 24 часа нас посетили 11568 программистов и 968 роботов. Сейчас ищут 372 программиста ...

Эмуляция "Регистра сведений" из 1С в Laravel

Тема в разделе "Laravel", создана пользователем snakenest, 6 дек 2022.

  1. snakenest

    snakenest Новичок

    С нами с:
    1 дек 2022
    Сообщения:
    12
    Симпатии:
    1
    в 1С есть такой интересный метаобъект как "Регистр Сведений", по факту это таблица, к котрой прикручено несколько view "срез первых" и "срез последних"
    Есть задача - сделать в laravel что-то наподобие таково вот регистра, который бы инкапсулировал работу с ценами.
    Т.е. есть такой же справочник номенклатур, как и в 1С,
    для каждого элемент котрого необходимо проставить цену, а так же по аналогии с регистром, необходимо получать цену на номенклатуру в разрезе времени.

    Я сделал модель Номенклатура(Nomenclature) с полями [id,caption] и модель ЦенаНоменклатуры(NomenclaturePrice) с полями [id,nomenclature_id,startdate,price].

    Как пример, имеем справочник Nomenclature с записью - id:1, caption:'Рога'
    и справочник NomenclaturePrice со следующими запсями:
    id:1, nomenclature_id:1, startdate:'01.01.2022', price:10
    id:2, nomenclature_id:1, startdate:'01.03.2022', price:20
    id:3, nomenclature_id:1, startdate:'01.06.2022', price:30

    Вопрос, как используя методологию работы фреймворка laravel, получить цену на укзанную дату?
    А так же, как лучше сделать логику получения текущей цены (что является частным случаем первого вопроса)?

    хотелось бы уточнить, что справочник номенклатур - нехилый, как и регистр с ценами, т.е. для получения текущей - обычный view может и не так быстро отработать, как хотелось бы
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732
    А даты вот прямо вот так, строками в тупую или датами? Тут, в принципе, и лара не причём, главное - как у вас база организована. Всё равно же в итоге будут работать обычные запросы
     
  3. snakenest

    snakenest Новичок

    С нами с:
    1 дек 2022
    Сообщения:
    12
    Симпатии:
    1
    ну нет конечно же, если бы я написал их в формате unixtime, то думаю возникли бы вопросы :)

    Вопрос, именно как организовать базу, чтобы используя возможности фреймворка laravel съэмулировать работу регистра 1С
    т.е. можно написать тонну кода PHP, чтобы выбрать текущую цену, или цену на указанную дату, но мне кажется что в laravel можно это сделать используя сущности и методологии этого фреймворка, особенно глядя на его eloquent
    --- Добавлено ---
    Как пример, я могу сделать триггер в БД, который при Insert, update, delete, будет выбирать цену с максимальной датой и устанавливать признак в таблице nomeclatureprice что эта запись - текущая цена (т.е. действующая на сегодня), или могу это сделать методами ларавел при сохранении объекта, или могу сделать запросом при выборе текущей цены у объекта номенклатура.
    и еще 100 разных вариантов :)

    Мой вариант решения данной задачи:
    в БД:
    1. триггер в БД, который ставит признак у записи - текущая цена
    2. процедура выбора в БД, которая выдает цену на указанную в параметре дату (select t.* from currentprice(nomenclature_id,pricedate) t
    в Ларавел:
    1. отношение в модели nomeclature к модели nomeclatureprice 1 к 1 с признаками nomenclature_id и iscurrent, для выбора текущей центы
    2. метод модели nomeclature, priceс парметром ondate - который делает прямой запрос к процедуре БД currentprice
    3.в модели nomeclature сделать отношение 1 ко многим к модели nomeclatureprice, чтобы получить весь список установленных цен

    Но мое ИМХО, что логика установки текущей цены в БД - не совсем соответствует методологии laravel, да и вобщем не очень, т.к. при смене логики работы, методы БД придется менять совместно с ларавелевской. Т.е. по идее необходимо ииспользовать или БД или ларавел.
    Потмоу и спрашиваю, как бы Вы реализовали это? Как поступить правильно?
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732
    Если уже ставите признак, что текущая цена - не вижу необходимости в процедуре. И можно ловить события ларавеля вместо тригера, и ставить текущую цену - тут уж как вам больше нравится.
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.619
    Симпатии:
    692
    Адрес:
    Татарстан
    Ключевой вопрос - а зачем???
    Это фишка 1с и его организации, и не факт что оно нужно ещё где-то...
     
  6. snakenest

    snakenest Новичок

    С нами с:
    1 дек 2022
    Сообщения:
    12
    Симпатии:
    1
    Не стоит так категорично.
    "Ведь, если звезды зажигают —
    значит — это кому-нибудь нужно?
    "
    В.В. Маяковский
    --- Добавлено ---
    Вот как раз и вопрос в этом :)

    Вопрос, что будет правильнее реализовать? Использовать процедуры, триггеры, вью БД, или всю кухню исключительно в ларавел?
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.493
    Симпатии:
    1.732
    Всё, что удобно. Используя исключительно ларавел, вы получаете относительную независимость от БД. Используя средства БД, вы получаете скорость, поскольку все данные крутятся внутри одного процесса. Лично я использую и БД, и laravel.
     
    don.bidon нравится это.
  8. don.bidon

    don.bidon Новичок

    С нами с:
    28 мар 2021
    Сообщения:
    551
    Симпатии:
    84
    Когда занимался разработкой CMS-ки, всё логику размещали в PHP, но там требования отличные от текущих были, потому голосую за @mkramer.