• Как правильно в Laravel объединить дату и время если они находятся в разных полях?

    @iljaGolubev
    use Illuminate\Database\Eloquent\Casts\Attribute;
    
    class Order extends Model{
    
        protected $casts = ['date_time' => 'datetime:Y-m-d H:00'];
    
        function dateTime(): Attribute
        {
             return Attribute::make(
                get: fn () => $this->castAttribute(
                      'date_time',
                      ($this->date ?: '1970-01-01') . ' ' . ($this->time ?: '10:00:01')
                   )
                )
            );
        }
    
    }

    # php artisan tinker
    App\Models\Order::first()->date_time;
    # = Illuminate\Support\Carbon @0 {#7053
    #   date: 1970-01-01 00:00:00.0 UTC (+00:00),
    #  }


    https://laravel.com/docs/10.x/eloquent-mutators#de...
    Ответ написан
    Комментировать
  • Как правильно преобразовывать данные из БД в структурированные объекты?

    php666
    @php666
    PHP-макака
    Если абстрагироваться от советов использовать полноценный ОРМ, то вот:

    SELECT {$this->getSelect()}
          FROM `{$this->table}` p 
          {$this->getJoins()}
          {$this->getWhere()} // на основе переданных where сформирует условия либо пустоту, если условий небыло
    -- эта дичь в последствии станет неработоспособной и ты придешь к этому:

    public function getModelBySql($sql);
    public function getModelListBySql($sql)

    ибо уместить в вышеприведенную ерунду все возможности sql не возможно. Говорю на личном опыте, сам такое писал.

    function format($row){
    
        $post = new PostEntity($row['id'], $row['title']);
    
        if(isset($row['userId'])){
          $user = new UserEntity($row['userId']);
          if(isset($row['userName'])){
            $user->setName($row['userName']);
          }
          $post->setAuthor($user);
        }
    
        return $post;
    
      }
    слишком сложная идеология. PostEntity может содержать немыслимое кол-во связей
    PostEntity->Author->Country->Region->City->Street
    ты это все ручную будешь прописывать все это?

    . К тому же, я люблю контролировать производительность,
    велосипеды ты любишь.
    Коли так, то остановись на каком-то тривиальном final решении. Иными словами создай колесо, но не пытайся строить машину - все равно не выйдет в одиночку.
    Ответ написан
    3 комментария
  • Npm, Webpack, NodeJs с чего начать?

    @deliro
    Фронт развился в какую-то неправильную сторону, это правда
    Вкатиться на фронт очень сложно, это тоже правда. Причём, необоснованно сложно.

    Я бы выделил два пути, как можно въехать во всё это:
    1. Создать приложение на Vue или React по туториалам, затем разобраться, как и зачем оно всё
    2. Разобраться как и зачем оно всё (aka Vanilla JS), потом заняться реактами

    Имхо, вариант №2 предпочтителен и более прост, потому что на варианте №1 есть огромный шанс застрять, никогда не разобравшись, как оно работает а при любых нешаблонных ошибках поднимать лапки.

    Что здесь нужно понимать:
    1. Есть разные версии ES (ecmascript), они все обратносовместимые. Программист может писать на любой версии, какая ему нравится. Обычно берут последнюю стабильную

    2. Для проекта обычно есть две версии ES: та, на которой пишут программисты и та, которая исполняется в браузере или в ноде (об этом позже). Например, программист пишет на ES8, а код транслируется на ES5. Это позволяет использовать последние предсмертные хрипы писки моды JS при этом запуская всё на древнейшем говне вроде IE11. Перегонкой кода из JS/TS одной версии в JS другой версии занимается транспилятор: babel / esbuild / swc

    3. Новые версии JS содержат расширения стандартной библиотеки, которых нет в старых браузерах (например Array.from, Object.entries и т.п.). Эти дырки затыкают полифиллы, они же shims. Самая популярная дырозатыкательная машинка — corejs

    4. Весь код очевидно не пишется в одном файле и может быть написан на TypeScript (он же TS), JSX/TSX (реактовый синтаксис). Всё это нужно собрать в один или несколько файлов, то есть скомпоновать. Этим занимается bundler: часть webpack / esbuild / spark / etc.

    5. Этот же парень отвечает за то, чтобы та тысяча библиотек, что лежит в node_modules, попала в итоговый условный main.js, но не целиком, а только то, что используется. Последнее называется tree shaking (типа навозную кучу node_modules потрясли как дерево, что упало — то не нужно)

    6. (то самое "позже) Код может исполняться не только в браузере пользователя, но и на сервере без браузера вообще. Это нужно для SSR aka Server Side Rendering. SSR — это такой глобальный вонючий костыль для SEO. Дело в том, что стандартные SPA приложения содержат один DOM элемент, куда цепляется всё остальное приложение вроде реакта или вью, которое уже содержит всю вёрстку прямо в JS. Но не все поисковики согласны с таким подходом и некоторые (не будем показывать пальцем на яндекс) не умеют выполнять JS и индексируют только тот самый единственный DOM элемент, который существует на этапе отдачи страницы в браузер. Это уже потом к нему JS движком дорисовывается весь остальной сайт. Соответственно, сайт индексируется от слова "никак", а некоторым это важно. Например, когда SPA — это не админка. Для этого есть два выхода: страницы, важные для SEO, рендерить чем-то не-реактовым или сделать SSR — делать за яндекс работу на сервере (на ноде), представляя в уме, что у нас есть DOM и браузер (на самом деле нет), на выходе получать начальное состояние HTML, отдавать его клиенту (браузеру или поисковому роботу), а JS'ом её т.н. "гидрировать", иными словами — оживлять.

    7. webpack отвечает за всё вот это сверху в том или ином виде. Это такой кухонный комбайн, в который вкидываешь кучу хлама в одном виде, а получаешь другую кучу хлама в другом виде.

    Начать советую с parceljs, который сильно проще в освоении, чем webpack. И на написании кода максимально без библиотек.
    Ответ написан
    1 комментарий
  • Можно ли доверять коду ошибки Mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Server Error Message Reference

    Error number: 1452; Symbol: ER_NO_REFERENCED_ROW_2; SQLSTATE: 23000

    Message: Cannot add or update a child row: a foreign key constraint fails (%s)

    InnoDB reports this error when you try to add a row but there is no parent row, and a foreign key constraint fails. Add the parent row first.

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

    Или перед вставкой нужно создать запрос на проверку существования такой записи в связующей таблице?

    А вот задайте себе вопрос - откуда возьмётся то самое значение user_id = 3, которое Вы собираетесь вставить? я не вижу иного способа получить данное значение кроме как сделать запрос в родительскую таблицу. А коли из неё вернётся нужное значение - то запись, из которой взято это значение, совершенно очевидно в таблице есть.
    Ответ написан
    5 комментариев
  • Можно ли доверять коду ошибки Mysql?

    Stalker_RED
    @Stalker_RED
    Коды ошибок могут перестать использоваться в новых версиях, иногда добавляются новые, но значения обычно не меняют.

    Но вообще, обычно так не делают. Сама ситуация, что у вас появился откуда-то пост с несуществующим user_id - довольно странная. Откуда в приложении может взяться неправильный user_id?
    Ответ написан
    3 комментария
  • Как сделать обращаться к файлам в одноименной папке?

    @dodo512
    Как на самом деле работает mod_rewrite
    Важно понимать, что изменение запроса не заканчивается на последнем RewriteRule. После того, как сработало последнее правило RewriteRule, mod_rewrite смотрит, изменился запрос или нет. Если запрос изменился, его обработка начинается заново с начала .htaccess.
    Адрес admin/run.php успешно совпадает с шаблоном ^admin/(.*)$ и происходит бесконечный цикл.
    После исчерпания LimitInternalRecursion обработка запроса завершается с ошибкой 500.

    Достаточно добавить исключение для admin/run.php
    RewriteCond %{REQUEST_URI} !^/admin/run\.php
    RewriteRule ^admin/(.*)$ /admin/run.php?request=$1 [QSA,L]

    Или так
    RewriteCond $1 !^run\.php
    RewriteRule ^admin/(.*)$ /admin/run.php?request=$1 [QSA,L]


    Или добавить проверку, что адрес не является существующим файлом
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^admin/(.*)$ /admin/run.php?request=$1 [QSA,L]


    В переменной %{ENV:REDIRECT_STATUS} сохраняется код с которым завершилось предыдущее внутреннее перенаправление. Эта переменная пуста только на первой итерации обработки запроса.
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^admin/(.*)$ /admin/run.php?request=$1 [QSA,L]
    Ответ написан
    Комментировать
  • Как достать превью видео с youtube?

    @DimaX
    Чтобы 100% надежно - это брать данные у первоисточника, т.е. из Youtube API, информация тут https://developers.google.com/youtube/v3/docs/vide... , вам нужна будет часть snippet (параметр part=snippet в запросе к API):

    https://www.googleapis.com/youtube/v3/videos?id=%VIDEO_ID%&part=snippet

    Если самостоятельно разбираться с программированием, API и прочим не планируется, то можно использовать бесплатный онлайн сервис, который выдает ссылку на превью видео в максимальном доступном качестве.
    Ответ написан
    Комментировать
  • Почему класс объявляется внутри проверки на существование класса?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Так делают, когда нужно обеспечить поддержку разных версий подключаемых либ. И обеспечить работу там, где нет такого класса.

    Пример:

    В php7 добавилась функция error_clear_last

    Если ты запустишь такой код в php7, то все будет ок
    var_dump(error_get_last());
    error_clear_last();
    var_dump(error_get_last());

    но если в php5 то будет ошибка

    ----

    Теперь другая ситуация, объявляем в php5
    function error_clear_last() {}
    будет все ок, но в PHP7 будет ошибка тк существует уже такая встроенная функция

    ----

    Задача, надо чтобы работало и там и там
    if (!function_exists('error_clear_last')) {
        function error_clear_last() {}
    }

    В итоге, в PHP7 функция уже существует и будет использоваться встроенная, в PHP5 функция не существует и будет использоваться твоя.

    У тебя, тоже самое, только с классами.
    Ответ написан
    1 комментарий
  • Как прочитать данную php переменную?

    @slavabars
    Веб программист
    Если $dynamic_url найден в массиве $ignore_pages то true иначе false

    Но это бредовая идея, т.к. in_array и так вернет true или false

    $ignore =in_array($dynamic_url,$ignore_pages);
    Ответ написан
    Комментировать
  • В каком формате хранить новости?

    @phoenix_tf
    Make IT
    А в чём собственно проблема в преобразовании на лету?
    Преобразование делать в любом случае, так что рано или поздно доведёте свои регулярки до правильного состояния. Что там "пойдёт насмарку", если вы в механизм, понимающий только bb-коды, не передадите атрибуты data, в упор непонятно.
    Пробегитесь заранее по своей табличке новостей своим преобразатором, и проконтролируйте результат хотя бы выборочно хотя бы визуально (если заморочиться, поищите или напишите какой-нибудь bb-линтер).

    Если проблема в ресурсах на преобразование, то да, либо используйте доп. поле как кеширующее, либо какие-то другие кеширующие средства.
    По-другому, в общем-то, никак эта "проблема" не решается.
    Ответ написан
    Комментировать
  • Что означат регулярка [^>]+?

    Один или больше любых символов, кроме >. Всё до конца объявления тега, иными словами.
    Ответ написан
    Комментировать
  • Phpstorm и документация кода

    @Trobing
    Для просмотра документации нужно нажать Ctrl+Q на функции.
    Ответ написан
    Комментировать