Ответы пользователя по тегу Symfony
  • Как не вываливаться в memory limit при работе с доктриной?

    part_os
    @part_os
    Сложное в простом
    1. выполняйте пачками, выберите оптимальное количество 100, 500, 1000
    2. между пачками зачищайте доктрину, и мусор
    use Doctrine\Persistence\ManagerRegistry;
     private ManagerRegistry $registry;
    
            $this->registry->reset();
            
            foreach ($this->registry->getConnections() as $connection) {
                $connection->close();
            }
    
            gc_collect_cycles();
    Ответ написан
  • Фиктивная сущность phpunit?

    part_os
    @part_os
    Сложное в простом
    Начните пользоваться моками. https://phpunit.readthedocs.io/ru/latest/test-doub...
    Подход с ин мемори и ин мемори сущностями тоже работает, тогда вам нужно использовать интерфейс и реализовывать необходимую логику в этих сущностях.
    Ответ написан
    Комментировать
  • Фильтрация по большому количеству параметров QueryBuilder, какие есть варианты?

    part_os
    @part_os Автор вопроса
    Сложное в простом
    Сделал примерно как Илья Зябиров описал

    interface PropertyQueryOptionsInterface
    {
    
        /**
         * @param array $attribute
         */
        public function fill(array $attribute): void;
    
        /**
         * @param QueryBuilder $queryBuilder
         */
        public function addWhere(QueryBuilder $queryBuilder): void;
    }


    class RangePropertyPriceOption implements PropertyQueryOptionsInterface
    {
    
        public const TYPE = 'RangePropertyPriceOption';
    
        /**
         * @var string
         */
        protected $alias;
    
        /**
         * @var float
         */
        protected $min = null;
    
        /**
         * @var float
         */
        protected $max = null;
    
        /**
         * @param array $attribute
         */
        public function fill(array $attribute): void
        {
    
            if (isset($attribute['key'])) {
                $this->alias = $attribute['key'];
            }
    
            if (isset($attribute['value'])) {
    
                if (isset($attribute['value'][0])) {
                    $this->min = $attribute['value'][0];
                }
    
                if (isset($attribute['value'][1]) && $attribute['value'][1] != 0) {
                    $this->max = $attribute['value'][1];
                }
            }
    
        }
    
        public function addWhere(QueryBuilder $queryBuilder): void
        {
    
            $whereByValue = $this->alias === Property::FILTER_RANGE_PRICE ? 'price' : 'areaPrice';
    
            if (!is_null($this->min)) {
    
                $whereParameter = ':' . 'min_' . $whereByValue;
    
                $queryBuilder
                    ->andWhere(sprintf('p.%s >= %s', $whereByValue, $whereParameter))
                    ->setParameter($whereParameter, $this->min);
            }
    
            if (!is_null($this->max) && $this->max != 0) {
    
                $whereParameter = ':' . 'max_' . $whereByValue;
    
                $queryBuilder
                    ->andWhere(sprintf('p.%s <= %s', $whereByValue, $whereParameter))
                    ->setParameter($whereParameter, $this->max);
            }
        }
    }


    foreach ($options['propertyQueryOptions'] as $queryOption) {
    
                    if ($queryOption instanceof PropertyQueryOptionsInterface) {
                        $queryOption->addWhere($queryBuilder);
                    }
    
                }
    Ответ написан
    Комментировать