• Как максимально быстро добавить огромное количество записей в БД без дублей?

    Frostealth
    @Frostealth
    Backend Developer
    Как вариант: отфильтровать `$numbers` на стороне PHP и вставить пачкой.

    // избавляемся от возможных дубликатов
    $numbers = collect($numbers)->unique();
    // pluck('num') вернет нам список значений атрибута num, а не список моделей
    $existingNumbers = Model::query()->whereIn('num', $numbers->toArray())->pluck('num');
    // с помощью diff получаем элементы, которых нет в $existingNumbers
    $newNumbers = $existingNumbers->diff($numbers)->mapWithKeys(function ($value, $key) {
        // ['one', 'two'] => [['num' => 'one'], ['num' => 'two']]
        return [$key => ['num' => $value]];
    });
    
    Model::query()->getConnection()->transaction(function () use ($newNumbers) {
        Model::query()->insert($newNumbers->toArray()); 
    });


    При очень больших данных в БД нужно вытаскивать из БД чанками (пачками определенного размера, например по 500 000), а не сразу все.
    // избавляемся от возможных дубликатов
    $newNumbers = collect($numbers)->unique();
    Model::query()->toBase()->whereIn('num', $numbers->toArray())
          ->chunk(500000, function ($existingNumbers) use (&$newNumbers) {
               // с помощью diff получаем элементы, которых нет в $existingNumbers
              $newNumbers = $newNumbers->diff($existingNumbers);
          });
    
    // ['one', 'two'] => [['num' => 'one'], ['num' => 'two']]
    $newNumbers = $newNumbers->mapWithKeys(function ($value, $key) {
        return [$key => ['num' => $value]];
    });
    
    Model::query()->getConnection()->transaction(function () use ($newNumbers) {
        Model::query()->insert($newNumbers->toArray()); 
    });


    Также можно воспользоваться ON CONFLICT, если СУБД поддерживает подобное. Например, у SQLite - ON CONFLICT DO, у MySQL - INSERT IGNORE. Это позволит избавиться от выгрузки данных из БД, что уменьшит потребление памяти приложением и сократит количество запросов.
    Laravel имеет для этого метод Query::insertOrIgnore(), который будет глушить все ошибки от некоторых БД, но для некоторых не поддерживается. Поддерживаемые БД: MySQL, SQLite, PostreSQL.
    Необходимо, чтобы на атрибут `num` в БД стоял constraint unique, иначе БД просто вставит дубликат.
    $numbers = collect($numbers)->unique()->mapWithKeys(function ($value, $key) {
        return [$key => ['num' => $value]];
    });
    
    Model::query()->getConnection()->transaction(function () use ($numbers) {
        Model::query()->insertOrIgnore($numbers->toArray());
    });


    Индексы и explain изучить не помешает. Размер чанка подобрать по возможностям железа.
    Индекс на num значительно ускорит выборку, но скорость вставки снизится.
    Так же отказ от ORM (Eloquent), объектов и использование голого SQL с PDO ускорит работу.
    На большие данные и нагрузки нужно мощное железо. Может потребоваться масштабирование и т.д.
    Ответ написан
    Комментировать
  • Как настроить Laravel и smtp mail.ru (почта для доменов)?

    @EVOSandru6
    Рабочий вариант:

    Возможно ssl сертификат и не нужен, но я поставил Lets encrypt.

    MAIL_DRIVER=smtp
    MAIL_HOST=smtp.mail.ru
    MAIL_PORT=465
    MAIL_USERNAME=domen.zone@mail.ru
    MAIL_PASSWORD=pass
    MAIL_ENCRYPTION=ssl
    MAIL_FROM_ADDRESS=domen.zone@mail.ru
    MAIL_FROM_NAME='tra ta ta'
    Ответ написан
    1 комментарий
  • Open Server работает очень медленно, как ускорить его работу?

    skapunker
    @skapunker
    Умный
    Столкнулся с такой же проблемой. Решил так: в настройках движка сайта в конфиге для подключения к БД вместо localhost написал 127.0.0.1 и все стало норм.
    Ответ написан
    9 комментариев
  • Кто-то уже окунался в разработку с Nuxt 3?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Вы соберёте все проблемы и завалите все дедлайны. :)

    С таким же вопросом сталкиваюсь, смотрел - он прям очень, очень сырой, я был крайне разочарован.
    Нельзя это тащить в продакшен, оно падает на каждый чих, причём почти всегда без внятной возможности понять, что пошло не так.

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

    Да и вообще есть ощущение, что они слишком фанатично пытаются всё упростить и обвешать магией, ушли куда-то не туда.
    Всякий сахарок - это прикольно, но должно быть опционально и навешиваться поверх уже готовой, работающей системы, а там половина issue - это борьба с теми проблемами, которые они сами себе придумали в погоне за "хотим, чтобы тут одну строчку написать - и дальше оно всё само".
    Но альтернатив не видно, поэтому пока Nuxt 2, возможно Nuxt Bridge, но и то смотреть надо.

    Другой вопрос - а зачем вам SSR для CRM? Для морды можно и пререндер сделать, а всё что за авторизацией - кому вообще интересно, есть там серверный рендеринг или нет?
    Ответ написан
    4 комментария
  • Как удалить элемент коллекции laravel?

    @Camaro67
    Помог? - жми "Отметить решением"
    Документацию читаем, там очень много интересного.

    $collection = collect(['Я', 'не', 'читаю', 'документацию']);
    $collection->forget(1);
    $collection->dump(); // ['Я', 'читаю', 'документацию']

    А так же с коллекцией можно работать как с обычным массивом, а это значит, что unset тоже сработает: unset($collection[1]);

    И даже это не все, вообщем, как уже сказал: читайте документацию.
    Ответ написан
    1 комментарий
  • Как найти слова без пробелов между скобками?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    \S соответствует любому символу, отличному от пробела.
    <?php
    $text = "Не следует, однако, забывать о том, что начало [повседневной] работы по [формированию позиции] влечет за собой [процесс внедрения и [модернизации] системы обучения кадров!";
    preg_match_all("/\[(\S+)\]/", $text, $matches);
    var_dump($matches[1]);


    Share PHP code online
    Ответ написан
    1 комментарий
  • Как реализовывать наследование моделей в laravel?

    @jacob1237
    То что Вы пытаетесь реализовать, называется наследованием таблиц (Table Inheritance) - это такой способ эмулировать наследование классов в реляционных СУБД.

    Всего существует несколько известных вариантов решения такой проблемы, например Single Table Inheritance и Class Table Inheritance (это если не учитывать нативную поддержку подобных вещей в некоторых СУБД, например PostgreSQL).

    Полиморфные же связи (которые по-дефолту в Laravel) - это не очень хороший способ реализации, потому что не позволяет поддерживать целостность связей на уровне СУБД. Однако можно использовать и его, если Вам эта целостность не очень важна (ее надо будет поддерживать на уровне приложения).

    К сожалению Eloquent не поддерживает ни Single Table Inheritance, ни Class Table Inheritance (зато их поддерживает Doctrine из Symfony), поэтому придется писать вручную.

    Прежде чем это делать, я бы Вам посоветовал разобраться как Profile относится к User и OrgAdmin.
    Является ли Profile подвидом пользователя (из названия честно говоря не понял), или же это просто набор дополнительных полей, которые можно оформить в виде связей?

    Если и Profile и OrgAdmin - это подвиды (подтипы) пользователей со своим собственным набором полей, то Вам нужно добавить в общую таблицу отдельное поле type (это называется дискриминатор), в котором у Вас будет проставлен тип пользователя. Например 1 для User, 2 для Profile и 3 для OrgAdmin.
    Короче очень похоже на стандартный Polymorphic Relationships из Laravel.

    А потом переопределяете у модели User функции newFromBuilder() или newInstance() в которых Вы укажете какие классы моделей создавать для конкретного type. Вот например статья.

    Дальше для Class Table Inheritance можно в трейт поместить функцию сохранения и родителя и потомка, потому что сохранять их придется вместе (на уровне БД), в зависимости от измененных свойств. Кроме того, нужно будет позаботиться об отображении (mapping) атрибутов родителя на потомков (__set и __get), на случай если вдруг захочется делать вот так (представьте что атрибут name принадлежит родителю - модели User):
    $profile = new Profile();
    $profile->name = 'John Doe';
    $profile->save();


    Короче это гемор в Laravel. Поэтому перед тем как делать, подумайте можно ли решить задачу проще - например через Single Table Inheritance, поместив все атрибуты в одну таблицу, либо делайте через стандартные полиморфные связи.

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

    Погуглите по указанным ключевым словам (паттернам), может что уже появилось для Laravel.
    Ответ написан
    3 комментария
  • Как установить laravel-elixir на win8 x64?

    zorca
    @zorca
    Elixir два года не обновляется, используйте Laravel Mix.
    Ответ написан
    Комментировать
  • Как подключить и компилить глобальный sass файл в Nuxt.js?

    Hardjuice
    @Hardjuice
    Верстальщик
    Ответ написан
    Комментировать
  • Как подключить и компилить глобальный sass файл в Nuxt.js?

    nuykon
    @nuykon
    Full Stack Developer
    nuxt.config.js
    css: [
        'normalize.css/normalize.css', // из node__modules
        '@/assets/css/main.styl' // из проекта
      ],

    Я использую stylus, но аналогично подключается и less и sass
    Плюс нужно установить loader, в вашем случае npm i sass-loader -D
    Ответ написан
    Комментировать
  • Переход из 1С в web-разработчики (PHP ) в 35 лет. С чего начать и реально ли?

    @GrimJack
    Скажем так, минимальная база это уверенное знание html5+css3+js (в том числе умение работать с jquery, ajax и распространенными библиотеками (слайдеры там всякие))+php (умение прогать под wp не ограничиваясь шаблонами)
    Но у меня любовь к вэбу отпала через 2года углубленной работы в вэбе (спасибо русскому фрилансу)
    Потом уже определитесь, хотите в большие проекты на фреймворках (laravel, yii2 и другие) или вам больше нравится творить чудеса на готовых cms

    По поводу споров типа "готовые цмс для лохов, настоящие пацаны выбирают фреймворки" - да нифига, если руки из жопы, то тут ничего не поможет.

    Ах да, ИМХО
    Ответ написан
    3 комментария
  • Laravel 5, почему сам добавляет is not null к запросу?

    Sanasol
    @Sanasol Куратор тега Laravel
    нельзя просто так взять и загуглить ошибку
    https://github.com/laravel/framework/commit/1e8016...
    commit 1e80162e9a3a4c42a0079bd9f34e785197a66c07 refs/tags/v5.0.28
    Author: Carsten Bleicker
    Date: Tue Mar 17 12:59:10 2015 +0100

    [BUGFIX] hasMany or hasOne neets to check for foreign_key != null

    In case your model using HasOne, HasMany the query building needs additional
    check for foreign_key != null

    If don't you will receive any related item having foreign_key = null on a new object.
    Example of wrong behaviour:

    $foo = new Foo();
    $foo->save();

    $bar = new Bar();
    $this_should_not_holding_any_relation = $bar->getFoos()->getResutls()->toArray()

    In fact currenctly $bar->getFoos() finds any Foo() having foreign_key = null.
    SQL is "where bar.id = foo.foreign_key"
    wich is in fact "null = null" (any unrelated foo item)


    https://github.com/laravel/framework/blob/master/s...
    Просто баг закрыли.
    Ответ написан
    Комментировать
  • Множественный include одного файла каждый раз читает с диска или кешируется?

    BuriK666
    @BuriK666
    Компьютерный псих
    можно не заморачиваться, ОС сама закэширует файл к которому много обращений.
    Ответ написан
    1 комментарий