Задать вопрос
  • Проблемы с PDO в ООП, что делать?

    myks92
    @myks92 Куратор тега PHP
    Banan44, да) Это я поставил return, а вам решать))
  • Проблемы с PDO в ООП, что делать?

    myks92
    @myks92 Куратор тега PHP
    Banan44, return и точка с запятой.
  • Как настроить логин на сайт через контакт HWIOAuthBundle + Symfony4.3?

    myks92
    @myks92
    Игорь Фамилия, настройте виртуальные хосты для вашего проекта. Чтобы проект был доступен не по localhost/site. Почитайте как обойти: тут
  • Как заменить число в TH при нажатии на картинку?

    myks92
    @myks92
    Тимур Турсунбаев, фиговая реализация)) Но согласен. Такие данные должны храниться в data-id или что-то подобное.
    Если строка - преобразовать данные

    var a = Number("123"); // 123
  • Как настроить логин на сайт через контакт HWIOAuthBundle + Symfony4.3?

    myks92
    @myks92
    Игорь Фамилия, у вас должен быть домен, такой, на котором работаете.
    если это site.ru, то в вк должен быть он указан. Если site.loc, то такой домен и должен быть указан. Начните с этого.
  • Как выбрать из БД дату но вывести только месяц и день?

    myks92
    @myks92 Куратор тега PHP
    TNPTSYWWCC, да)) сорри. Исправил. Привык работать с объектом DateTimeImmutable
  • Написал класс но он выглядит как обычная функция, это нормально?

    myks92
    @myks92
    Антон Р., я ведь не знаю надо вам это или нет) Я лишь пример привел. Если это не надо, тогда передаете только время.
  • Написал класс но он выглядит как обычная функция, это нормально?

    myks92
    @myks92
    Антон Р., это если у вас разные типы продвижения. Можно сделать продвижениеТип.

    Типы:
    - Выделить цветом
    - Поднять в топ
    - Повесить метку "горящее предложение"

    и так далее

    У вас получается тип продвижения "Выделить цветом" время "10 минут". Проверку делаете через метод этоПродвигаемое

    В методе пишите если текущая дата - 10 минут < 0 тогда не показывать.. Ну как то так)
  • Выборка данных с перебором. Yii2?

    myks92
    @myks92 Куратор тега Yii
    darknet37, ахах) Ну если совсем туго, то можно так) Но решение вам я дал) Я ещё раз повторяюсь, что вы сделали тоже самое, что и я, только исковерканный вариант.

    Так должно работать.
    class Service extends ActiveRecord
    {
        public function getServiceSpec()
        {
            return $this->hasMany(ServiceSpec::className(), ['service_id' => 'id']);
        }
    }
    
    class ServiceSpec extends ActiveRecord
    {
        public function getService()
        {
            return $this->hasOne(Service::className(), ['id' => 'service_id']);
        }
     public function getServices()
        {
            return $this->hasMany(Service::className(), ['id' => 'service_id']);
        }
    }
    $service = Service::findOne(1);
    $serviceSpec = $service->serviceSpec;
    
    
    $serviceSpec = ServiceSpec::findOne(1);
    $services = $serviceSpec->services;
    
    $service = Service::find()->where('id' => 1)
    ->joinWith(['serviceSpec' => function (ActiveQuery $query) {
           $query->andWhere(['specialist_id' => 2]);
    }])
    ->all();
    $serviceSpec = $service->serviceSpec;
  • Написал класс но он выглядит как обычная функция, это нормально?

    myks92
    @myks92
    Антон Р., тогда я вам сделал) даже по DDD, а не только ООП) Приучайте себя назвать методы и классы своими именами. Если бы мы писали ваш пример на русском - это было бы так:

    class Объявления {
    
        private $продвижениеИд;
        private $продвижениеВремя;
    ....
    
       public function получитьПродвижение(): ?Продвижение
       {
           return new Продвижение($this->продвижениеИд, $this->Продвижение время);
       }
    
       public function этоПродвигаемое(): bool
       {
            return $this->получитьПродвижение() ? $this—>получитьПродвижение()->продвигаемое() : false
       }
    }


    И так далее
  • Выборка данных с перебором. Yii2?

    myks92
    @myks92 Куратор тега Yii
    darknet37, читайте, думайте)) Вы делаете тоже самое, только без связей)) Я же не вижу какие у вас таблицы и что с чем связать. Мне кажется проще чем у вас вопроса уже не может быть. В документации ваш пример есть, только с другими названиями))

    Этот метод должен быть в Service
    public function getServiceSpec()
        {
            return $this->hasMany(ServiceSpec::className(), ['service_id' => 'id']);
        }
  • Написал класс но он выглядит как обычная функция, это нормально?

    myks92
    @myks92
    Антон Р., мне не понятно что значит Item?) Методы и классы нужно называть своими именами. Так, чтобы их можно было читать как английский текст.

    У вас получается так:
    1. Класс объявлений (Advert)
    2. Класс продвижений (Promotion)

    Тогда получается так:
    class Advert {
    
        private $promotionId;
        private $promotionTime;
    ....
    
       public function getPromotion(): ?Promotion
       {
           return new Promotion($this->promotionId, $this->promotionTime);
       }
    
       public function isPromoted(): bool
       {
            return $this->getPromotion() ? $this—>getPromotion()->isPromoted() : false
       }
    }


    class Promotion 
    {
    
    	private $id;
    	private $date;
    
    	public function __construct(int $id, DateTimeImmutable $date)
        {
            $this->id = $id;
            $this->date = $date;
        }
    
        public function isPromoted(): bool 
        {	//Проверка
        	return $result;
      	}
    }
  • Выборка данных с перебором. Yii2?

    myks92
    @myks92 Куратор тега Yii
    darknet37, я так понимаю у вас первый класс называется service с таблицей service. Тогда вам нужно:
    $service = Service::findOne(123);
    $serviceSpec = $service->serviceSpec;
  • Yii2 Как добавить условие в запросе в связанных данных?

    myks92
    @myks92 Куратор тега Yii
    Павел, не за что) Иногда и запятую не видишь. А со стороны видно лучше...
  • Yii2 Как добавить условие в запросе в связанных данных?

    myks92
    @myks92 Куратор тега Yii
    Павел, откуда вы брали запросы?) У вас запрос на SQL был правильный, но не правильно был на AR. Сомневаюсь, что у вас запросы были одинаковые. Если посмотрите в дебаг панели какие шли запросы, то они разные. Иначе бы у вас был успех и мы это не обсуждали)) AR лишь обертка над SQL запросами.
  • Yii2 Как добавить условие в запросе в связанных данных?

    myks92
    @myks92 Куратор тега Yii
    Daria Motorina, необязательно это делать на AR, лучше не делать на AR! Это пример.

    В сложных запросах используйте простой SQL или PDO. Хорошей практикой будет, если Вы отделяете чтение данных от модифицирования данных. При таком подходе Вы заметите, как большинство связей и исчезнут из-за ненадобности, а сам код в модели упростится... Уберутся лишние методы для отображения данных, исчезнут некоторые связи, хелперы и так далее. Модель будет работать только с модификацией данных, а SQL отвечать за отображение данных.

    Если объяснять по CRUD:
    Там, где R (read) используем SQL
    Там, где CUD (create, update, delete) AR или ORM
  • Yii2 Как добавить условие в запросе в связанных данных?

    myks92
    @myks92 Куратор тега Yii
    Павел, помогло, потому что правильно используем AR)) Иногда не понятно как использовать AR со сложными запросами. Вот вам большой пример со всем возможным)

    /**
             * @var TblItemQuery $query
             */
            $query = TblItem::find()
                ->alias('tbl')
                ->select([
                    'obj.id AS objId',
                    'obj.name AS objName',
                    'obj.slug AS objSlug',
                    'obj.text_price AS objTextPrice',
                    'town.slug AS townSlug',
                    'type.slug AS typeSlug',
                    'room.id AS roomId',
                    'room.name AS roomName',
                    'room.osn AS roomOsn',
                    'room.dop AS roomDop',
                    'roomcat.name AS roomCatName',
                    'tbl.id AS tblId',
                    'tbl.kf AS tblAdultKf', // коэффициент взрослых
                    'tbl.text AS tblTextPrice', // текст под таблицей
                    'txt.text AS tblTextTplPrice', // текст под таблицей
                    'l.name AS lechenieName',
                    'p.name AS pitanieName',
                    'spoS.spoStandartTurist',
                    'spoS.spoStandartAgent',
                    'spoS.spoStandartMalutki',
                    'spoA.spoAverageTurist',
                    'spoA.spoAverageAgent',
                    'spoA.spoAverageMalutki',
                    'spoA.spoDays',
                    'colAge.minAge',
                    'colAge.maxAgeFree',
                    'col.is_free AS isFree',
                    new Expression("$this->totalDays AS totalDays"),
                    new Expression("$kfSum AS kfSum"),
                    new Expression("$this->kidAge AS kidAge"),
                    new Expression('MIN(`row`.`date_from`) AS `date_min`'),
                    new Expression('MAX(`row`.`date_to`) AS `date_max`'),
                    $this->sumExpression('osnTblPriceSpo', $kfSum, $sum === self::AS_OSN),
                    $this->sumExpression('osnTblPriceNetto', $kfSum, $sum === self::AS_OSN),
                    $this->sumExpression('osnTblPriceFreeSpo', $kfSum, $sum === self::AS_FREE),
                    $this->sumExpression('osnTblPriceFreeNetto', $kfSum, $sum === self::AS_FREE),
                    $this->sumExpression('dopTblPriceSpo', $kfSum, $sum === self::AS_DOP),
                    $this->sumExpression('dopTblPriceNetto', $kfSum, $sum === self::AS_DOP),
                    $this->sumExpression('numTblPriceSpo', $kfSum, $sum === self::AS_MIX),
                ])
                ->innerJoinWith([
                    'rows row' => static function (TblRowQuery $query) {
                        $query->innerJoinWith([
                            'data d' => static function (TblDataQuery $query) {
                                $query->innerJoinWith([
                                    'col col' => static function (TblColQuery $query) {
                                        $query->innerJoinWith([
                                            'type coltype',
                                        ])->published();
                                    },
                                ]);
                            },
                        ])->published();
                    },
                ])
                ->innerJoinWith([
                    'room room' => static function ($query) {
                        /** @var ActiveQuery $query */
                        $query
                            ->innerJoinWith([
                                'item obj' => static function ($query) {
                                    /** @var ActiveQuery $query */
                                    $query->innerJoinWith(['town town', 'type type']);
                                },
                            ])
                            ->innerJoinWith(['category roomcat'])
                            ->published();
                    },
                ])
                ->joinWith(['lechenie l', 'pitanie p', 'textRelation txt'])
                ->leftJoin(['colAge' => $this->getMinChildAgeQuery()], 'colAge.tblId = tbl.id')
                ->leftJoin(['spoS' => $this->getSpoStandartQuery()], 'spoS.tblId = tbl.id')
                ->leftJoin(['spoA' => $this->getSpoAverageQuery()], 'spoA.tblId = tbl.id')
                ->where(['in', 'col.id', $colIds])
                ->andWhere(
                    [
                        'OR',
                        [
                            'AND',
                            ['=', 'col.is_free', TblCol::IS_FREE],
                            ['>=', 'd.data', 0],
                        ],
                        ['>', 'd.data', 0],
                    ]
                )
                ->andWhere(
                    [
                        'OR',
                        ['tbl.kf' => $this->adults], // убираем таблицы с коэффициентом не для расчета
                        ['tbl.kf' => null],
                    ]
                )
                ->andWhere(
                    [
                        'OR',
                        [
                            'AND',
                            ['>=', 'row.date_to', $this->dateFrom],
                            ['<=', 'row.date_from', $this->dateTo],
                        ],
                        [
                            'AND',
                            ['>=', 'row.date_from', $this->dateFrom],
                            ['<=', 'row.date_to', $this->dateTo],
                        ],
                    ]
                )
                ->andWhere(['obj.raschet_online' => 1])
                ->groupBy('row.tbl_id')
                ->having(['>=', 'date_max', $this->dateTo])
                ->andHaving(['<=', 'date_min', $this->dateFrom])
                ->andFilterWhere(['room.object_id' => $this->objId])
                ->andFilterWhere(['room.id' => $this->roomId])
                ->andFilterWhere(['tbl.id' => $this->tblId])
                ->byMinMaxPeriod($this->totalDays)
                ->published();
                
            //print_r($query->createCommand()->rawSql);
            
            $this->setUnion($query);
  • Почему не отображается гугл карта?

    myks92
    @myks92 Куратор тега Yii
    Михаил Балагура, значит проблем тут нет. Единственное может быть конфликт в подключении. Если, например, какой-то скрипт выше перебивает ваш. Но я сомневаюсь в этом. Значит проблема в самом скрипте. Попробуйте поменять ширину, долготу. Тут надо копаться в гугл документации. Я обычно использую яндекс карты. Так что подсказать особо не могу в самом скрипте.
  • Почему не отображается гугл карта?

    myks92
    @myks92 Куратор тега Yii
    Михаил Балагура, попробуйте сделать так

    <?php 
    $js = <<< JS
    alert(123);
    JS;
    
    $this->registerJs( $js, $position = yii\web\View::POS_READY, $key = null );
    ?>​


    Если сработает - проблему искать надо не в yii, а правильности кода и чтения документации.

    И вижу в комментарии выше, что у вас key=*** уверен что там должен быть key, а не звездочки