Size: a a a

2019 September 05

RT

Roman Tsurkanu in Yii Framework 3
$sqlReader->withFilter(new SqlFilter(new Criteria()))->withLimit(100)
источник

RT

Roman Tsurkanu in Yii Framework 3
фильтр знает критерии и умеет их применять
источник

RT

Roman Tsurkanu in Yii Framework 3
ридер знает что фильтр умеет что то применять(build)
источник

AR

Anton Rybalko in Yii Framework 3
Проблема только в том, что SqlReader не сможет работать ни с каким фильтром кромк SqlFilter
Значит надо будет делать проверку в SqlReader
public function read(): iterable
{
   // ...
   if ($this->filter instanceof SqlFilter) {
       $condition = $this->filter->build();
   }
   // ...
}
Если зависимость от SqlFilter уж есть, не проще ли для использования бует все-таки сделать
$sqlReader->withCriteria(new Criteria())->withLimit(100)
И в SqlReader
public function read(): iterable
{
   // ...
   if ($this->criteria !== null) {
       $condition = (new SqlFilter($this->criteria))->build();
   }
   // ...
}
источник

AM

Alexander Makarov in Yii Framework 3
вероятно
источник

RT

Roman Tsurkanu in Yii Framework 3
в конструктор не вариант передавать фильтр? тогда можно было бы по сигнатуре указать с каким фильтром работает данный ридер
источник

RT

Roman Tsurkanu in Yii Framework 3
а withFilter будет его применять
источник

RT

Roman Tsurkanu in Yii Framework 3
хотя тоже самое получится
источник

RB

Rustam Badrutdinov in Yii Framework 3
<?php

use yii\db\Query;

interface FilterBuilder
{
   public function addEquals(string $field, $value);
}

class SqlFilterBuild implements FilterBuilder
{
   /
    * @var Query
    */
   private $query;

   public function __construct(Query $query)
   {
       $this->query = $query;
   }

   public function addEquals(string $field, $value)
   {
       $this->query->andWhere([$field => $value]);
   }

   public function getProduct() : Query
   {
       return $this->query;
   }
}

interface Criteria
{
   public function buildFilter(FilterBuilder $builder);
}

class EqualsCriteria implements Criteria
{
   /

    * @var string
    */
   private $field;
   private $value;

   public function __construct(string $field, $value)
   {
       $this->field = $field;
       $this->value = $value;
   }


   public function buildFilter(FilterBuilder $builder)
   {
       $builder->addEquals($this->field, $this->value);
   }
}
источник

RB

Rustam Badrutdinov in Yii Framework 3
смысл в том, чтобы сделать Filter, уж коли он специфичен для Reader'a, ещё и мостом. Методы вроде addFilter в Reader'e будут нарушать LSP если окажутся в интерфейсе, такую зависимость можно добавлять только в конструктор
источник
2019 September 07

AM

Alexander Makarov in Yii Framework 3
Довёл https://github.com/yiisoft/data/pull/3 до рабочего состояния. Примеры в readme. Как вам?
источник

RT

Roman Tsurkanu in Yii Framework 3
огонь. Фильтр крутой получился.
источник

RT

Roman Tsurkanu in Yii Framework 3
что осталось? чем помочь?
источник

AM

Alexander Makarov in Yii Framework 3
оценить, норм ли
источник

AM

Alexander Makarov in Yii Framework 3
нет ли косяков
источник

RT

Roman Tsurkanu in Yii Framework 3
Ок, смотреть только с точки зрения архитектуры или нейминг тоже?
источник

AM

Alexander Makarov in Yii Framework 3
всё что покажется не очень
источник

AM

Alexander Makarov in Yii Framework 3
буду рад любым комментам
источник

RT

Roman Tsurkanu in Yii Framework 3
Ок
источник
2019 September 08

М

Махмуд in Yii Framework 3
Просмотрел дата ридер. Подскажите правильно ли я понял. Для работы с базой данных надо будет писать свой ридер и переопределять методы ридера, чтоб в зависимости от фильтров и сортировки, подставлять условия в запрос, и в методе read вызывать метод all() в случае использования Актив Рекорд?
источник