Задать вопрос
  • Model::updateOrCreate почему не считывает в первом параметре, второй элемент массива?

    @Hfnas Автор вопроса
    Алексей Уколов, версия ларавела 5.7 , склоняюсь к тому, что плохо работает версия.
    Написано
  • Model::updateOrCreate почему не считывает в первом параметре, второй элемент массива?

    @Hfnas Автор вопроса
    Алексей Уколов,
    AmoContact::firstOrNew(['amoID' => $contacts[0]->getId(),'crmCompanyID'=>$companyID]);

    тоже не учитывает второй элемент массива первого параметра,несмотря на то, что
    protected $fillable = [
            'name',
            'amoID',
            'crmCompanyID'
        ];

    заполнено
    Написано
  • Model::updateOrCreate почему не считывает в первом параметре, второй элемент массива?

    @Hfnas Автор вопроса
    Алексей Уколов,
    class Model extends BaseCRM
    {
        protected $table = 'crmAmoContact';
    
        protected $casts = [
            'created' => 'datetime',
            'updated' => 'datetime',
            'name' => 'string',
            'phone' => 'string',
            'phone1' => 'string',
            'phoneNorm' => 'string',
            'email'=>'string',
            'amoID' => 'int',
            'crmAmoUserID' => 'int',
            'crmAmoUser2ID' => 'int',
            'crmAmoContactTypeID' => 'int',
            'crmCompanyID' => 'int',
        ];
    
        protected $fillable = [
            'name',
            'amoID',
            // 'crmCompanyID'
        ];
    ...
    }

    в бд crmCompanyID'обязательно к заполнению, не может быть нулем.
    Написано
  • Как сделать пакетную обработку в laravel?

    @Hfnas Автор вопроса
    И почему выше AmoLeadModel, а тут TestLeadModel

    Это одно и то же, в самом деле TestLeadModel= AmoLeadModel (просто я переименовала)
    Написано
  • Как сделать пакетную обработку в laravel?

    @Hfnas Автор вопроса
    ThunderCat, спасибо за выручку, заменила $leads[] на $leads (18000 записей отработал за 1час 35 мин). действительно сырые запросы быстрее выполняются
    SELECT * FROM `crmAmoLead` WHERE `amoID`=29705803 and `crmCompanyID`=1
    занимает 0.0003 секунд

    SELECT * FROM `crmAmoStatus` WHERE `amoID`=48505075 and `crmCompanyID`=1
    0.0002 сек

    SELECT * FROM `crmAmoContact` WHERE `amoID`=43222233 and `crmCompanyID`=1
    0.0008 сек


    677ae8c339037392708065.png
    677ae7d5a6367699101116.png
    677ae7e6f3a03352100389.png

    Пробовала Model:::updateOrCreate не сработало в случае создания....(Model::updateOrCreate почему не считывает в первом параметре, второй элемент массива?).
    Попробую завтра с сырыми запросами работать...выборка по одной записи(SELECT * FROM `crmAmoLead` WHERE `amoID`=29705803 and `crmCompanyID`=1
    SELECT * FROM `crmAmoStatus` WHERE `amoID`=48505075 and `crmCompanyID`=1
    SELECT * FROM `crmAmoContact` WHERE `amoID`=43222233 and `crmCompanyID`=1), наверное быстрее будет. Спасибо за наводку.
    Написано
  • Как сделать пакетную обработку в laravel?

    @Hfnas Автор вопроса
    ThunderCat ,
    Вытаскивание из api: амо записей занимаетi=1: <b>0.78996706008911</b>
    Вытаскивание из бд: сделки занимаетget -amolead:i=32405417: <b>0.042673110961914</b>
    Вытаскивание статуса из бд: <b>0.035158157348633</b>
    Вытаскивание контакта занимает из бд <b>0.035752058029175</b>
    Вытаскивание пользователя занимает из бд <b>0.034740924835205</b>
    Всего импорт записи занимает из бд<b>0.19417405128479</b>


    В целом , заметила одну тендецию по функции
    public function getLead($all=false)
        {        
            $filter = new LeadsFilter();
            $filter->setLimit(100); //было 250
    
            $leads = [];
    
            try {
                $leads[] = $this->apiClient->leads()->get($filter, [LeadModel::CONTACTS]); //<b>B=0.88946199417114 </b>сек(microtime(true))
                TestLeadModel::import($leads,$this->crmCompanyID,$constants);//<b>А</b>
                $i = 2;
                //разбивка по страницам
                while ($leads[0]->getNextPageLink() != null) {
                    $filter->setPage($i);
                    $leads[] = $this->apiClient->leads()->get($filter, [LeadModel::CONTACTS]);//<b>B</b>
                    TestLeadModel::import($leads,$this->crmCompanyID,$constants);//<b>А</b>
                    $i++;
                }
            } catch (AmoCRMApiNoContentException $exception) {
                Log::error(__METHOD__ . ' setLead:' . $exception->getMessage());
            }
        }


    B(api) отрабатывает 0.86 сек, А(import) с каждой итерации возрастает
    api:i=1: 0.86936402320862
    import:i=1: 39.916611194611
    api:i=:2 0.88946199417114
    import:i=:2 87.110013961792
    api:i=:3 0.59083104133606
    import:i=:3 153.32566094398
    api:i=:4 0.69996500015259
    import:i=:4 232.36356091499
    api:i=:5 0.74689602851868
    import:i=:5 302.61767816544
    api:i=:6 0.28452301025391
    Написано
  • Какое бесплатное решение для учёта времени лучшее в ubuntu?

    @Hfnas Автор вопроса
    это в консоль,неудобно....
    Написано
  • Как сделать пакетную обработку в laravel?

    @Hfnas Автор вопроса
    ThunderCat, благодарю за ответ, должно быть 18000, и будет 20000,в несколько нулей таблица...
    Конечно, я запуталась,
    Если формировать на каждой итерации value для инсерта, а потом соединить в один запрос
    INSERT into table(col1,co2. col3) values(), (),()
    не логично будет.
    для апдейт явно придется оставить айпи, то есть как я сделала....
    Написано
  • Как сделать пакетную обработку в laravel?

    @Hfnas Автор вопроса
    ThunderCat, интересный подход, благодарю сердечно за внимание, и все делать на третьем шаге запросами : https://laravel.com/docs/11.x/queries , попробую .
    Таким образом мы заполняем на 3 шаге получается каждый элемент массива перебираем:
    Есть в бд UPDATE set то то то (1 запись)
    НЕт в бд INSERT INTO 1запись.

    Или имеется ввиду пачками заполнять
    INSERT into table(col1,co2. col3) values(), (),()
    Update table set col=А, col=B where id=1; Update table set col=А1, col=B1 where id=2

    промежуточные результаты по прежнему через апи?:
    if (isset($contacts[0])) {
                        $TestContactEntity = TestContact::firstOrNew(['crmCompanyID'=>$companyID,'TestID' => $contacts[0]->getId()]);
                        if ($TestContactEntity->TestID===null){
                            $TestContactEntity->TestID=$contacts[0]->getId();
                            $TestContactEntity->crmCompanyID=$companyID;
                            $TestContactEntity->save();
                        }
    
                        $entity->crmTestContactID = $TestContactEntity->id;
                    }else{
                        $entity->crmTestContactID = null;
                    }



    Я не знаю, как для апдейт делать пакетную обработку. Подскажете: Ниже код не понимаю....
    Честно говоря я не понимаю,что такое в коде A,B?:
    UPDATE table 
    SET row = CASE
     WHEN id = X THEN 'A' 
     WHEN id = Y THEN 'B'
     ELSE row
    END
    WHERE id in(X, Y)
    Написано
  • Как сделать пакетную обработку в laravel?

    @Hfnas Автор вопроса
    ThunderCat, благодарю за столь усердное внимание к моей проблеме, и за ваше время и простите за мою невнимательность
    1)2) вместо for ($i = 1; $i <= 100; ++$i) { предполагается foreach ($rows as $row) {.
    3) Задача интеграция амо сделок в мою бд. Я беру в первой функции задачи пачку данных из амо -100шт.
    и фо второй функции начинаю интегрировать в бд. Да, вы правильно поняли задачу,: обновить состояние уже существующих записей и добавить из апи несуществующие. Вопрос в том , что неизвестно,какие записи существуют ,а какие не существуют,поэтому нужно апи. В который раз убеждаюсь, что без апи тут не обойтись.
    Написано
  • Как сделать пакетную обработку в laravel?

    @Hfnas Автор вопроса
    David Gegiya,
    https://laravel.com/docs/11.x/eloquent#chunking-results
    https://laravel.com/docs/11.x/eloquent#cursors

    К сожалению мне не подходит. Так как я запрашиваю с амо данные(беру пачку), и проверяю, есть ли амо ид в моей бд.
    Написано
  • Как сделать пакетную обработку в laravel?

    @Hfnas Автор вопроса
    David Gegiya, с наступающим, благодарю за ответ!
    как не обращаться к данным в цикле каждый раз?
    Мне нужно проверить на существование, и записывать в бд
    Можно поподробнее, как обьединять, мне нужно еще проверить на существование, если нет, то записать в бд, например, как тут:
    $TestStatusEntity = TestStatus::firstOrNew(['crmCompanyID'=>$companyID,'TestID' => $row->getStatusId()]);
                        if ($TestStatusEntity->TestID===null){
                            $TestStatusEntity->TestID=$row->getStatusId();
                            $TestStatusEntity->crmCompanyID=$companyID;
                            $TestStatusEntity->save();
                        }

    Если приведете пример, я буду благодарна Вам.
    Написано
  • Как сделать пакетную обработку в laravel?

    @Hfnas Автор вопроса
    ThunderCat, с наступающим! Благодарю за ответ!
    Кроме того, выборка по одной записи из бд в цикле - классическая ошибка, нужно объединить все запросы в один через join или in(), а дальше работать с полученным массивом.

    Можно поподробнее, как обьединять, мне нужно еще проверить на существование, если нет, то записать в бд, например, как тут:
    $TestStatusEntity = TestStatus::firstOrNew(['crmCompanyID'=>$companyID,'TestID' => $row->getStatusId()]);
                        if ($TestStatusEntity->TestID===null){
                            $TestStatusEntity->TestID=$row->getStatusId();
                            $TestStatusEntity->crmCompanyID=$companyID;
                            $TestStatusEntity->save();
                        }
    Написано
  • Как сделать пакетную обработку в laravel?

    @Hfnas Автор вопроса
    JhaoDa, да ошиблась, маленко, обновила вопрос, Есть ли инструменты вроде пакетной обработки , как в случае доктрины https://www.doctrine-project.org/projects/doctrine... ?
    Написано
  • Как настроить дебаг в консоли с помощью инструментов vscode && docker?

    @Hfnas Автор вопроса
    ky0 ,
    написала
    ports:
    - '9008:9008'

    version: "3.7"
    services:
      app:
        build:
          args:
            user: www
            uid: 1000
          context: ./
          dockerfile: Dockerfile
        image: laravel-image
        container_name: laravel-app
        restart: unless-stopped
        working_dir: /var/www/
        volumes:
          - ./:/var/www
          - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
        networks:
          - app-network
        ports:
          - '9008:9008'

    сейчас ничего не дебажит выдает ошибку
    67699155b62f5388088202.png

    Поменяла на
    ky0 ,
    написала
    ports:
    - '9008:9008'

    version: "3.7"
    services:
      app:
        build:
          args:
            user: www
            uid: 1000
          context: ./
          dockerfile: Dockerfile
        image: laravel-image
        container_name: laravel-app
        restart: unless-stopped
        working_dir: /var/www/
        volumes:
          - ./:/var/www
          - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
        networks:
          - app-network
        ports:
          - '9004:9008'

    Заработал дебаг на страницы , на консоль по прежнему выдает ошиббку "Xdebug: [Step Debug] Could not connect to debugging client. Tried: host.docker.internal:9008 (fallback through xdebug.client_host/xdebug.client_port)"
    и не дебажит.
    Написано
  • Как иициализировать 2 репы в одном проекте?

    @Hfnas Автор вопроса
    Откройте в VSCode папку ~/Projects/b24.loc/ и увидите основной репо и его связью.
    Открыв папку ~/Projects/b24.loc/packages/server увидите репо который там.
    Через меню File — Open Folder...


    Сергей Кузнецов, спасибо, мне нужно работать в server. Пока сойдет. Хотелось бы разобраться, но , видимо не суждено пока, видеть 2 репы одновременно.
    Написано
  • Как иициализировать 2 репы в одном проекте?

    @Hfnas Автор вопроса
    Сергей Кузнецов,
    по вашему ответу получается только
    6765160d7ec0a329276051.png
    Если не хотите игнорить папку server, то другой вариант — удалить ненужный пустой репо в папке
    rm -rf ~/Projects/b24.loc/packages/.git

    не получается , пробую удалить vscode и установить.
    Если вы смогли войти в каталог packages сразу после клонирования не создавая его, значит он уже есть в репозитории и игнор тут не поможет.

    и как быть?
    Написано
  • Как иициализировать 2 репы в одном проекте?

    @Hfnas Автор вопроса
    Сергей Кузнецов, так сделала, vscode не видит(смотрите скрины), пробую по вашему алгоритму
    Написано