Yii2 sphinx, limit 20, ну максимум 1000, нужно больше.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Leffken
Сообщения: 115
Зарегистрирован: 2015.07.10, 15:49
Откуда: yola
Контактная информация:

Yii2 sphinx, limit 20, ну максимум 1000, нужно больше.

Сообщение Leffken »

Всем привет!
Столкнулся с проблемой что при запросе, получаю 20:

Код: Выделить всё

$data = Index::find()->all();
echo count($data); //20
Ну ладно, индексы обычно большие попробуем поставить лимит

Код: Выделить всё

$data = Index::find()->limit(10000000)->all();
echo count($data); //1000
Хм, что за ерунда ?
Конечно это работает как надо:

Код: Выделить всё

$data = Index::find()->count();
echo $data; // 156000
НО!!! У меня получается довольно сложный запрос с использование GEODIST, который я засовываю в select, примерно так:

Код: Выделить всё

...
if ($form->finded_geo) {
$query = $query->addSelect(["GEODIST({$form->finded_geo->latitude}, {$form->finded_geo->longitude}, latitude, longitude, {in=deg}) as distance"])
->andWhere('distance<10000');
}
...
При выполнении ->count() получаю ошибку, мол distance не существует. Я так понимаю этот метод меняет весь select на COUNT(*).

Не подскажете как можно обойти лимит или же выполнять ->count() без замены селекта ?

UPD
Конечно можно накостылить через \yii\sphinx\activeDataProvider, но не думаю что это правильно и скорее всего выполнятся будет дольше!
phpshko
Сообщения: 260
Зарегистрирован: 2015.03.21, 02:49

Re: Yii2 sphinx, limit 20, ну максимум 1000, нужно больше.

Сообщение phpshko »

чтобы увеличить выборку попробуйте

Код: Выделить всё

$query->addOptions(['max_matches' => 10000])
чтобы узнать кол-во

Код: Выделить всё

$results = $query->showMeta(true)->limit(0)->search();
$count = (int)ArrayHelper::getValue($results, 'meta.total_found', 0);
Leffken
Сообщения: 115
Зарегистрирован: 2015.07.10, 15:49
Откуда: yola
Контактная информация:

Re: Yii2 sphinx, limit 20, ну максимум 1000, нужно больше.

Сообщение Leffken »

phpshko писал(а): 2017.06.09, 15:58 чтобы увеличить выборку попробуйте

Код: Выделить всё

$query->addOptions(['max_matches' => 10000])
чтобы узнать кол-во

Код: Выделить всё

$results = $query->showMeta(true)->limit(0)->search();
$count = (int)ArrayHelper::getValue($results, 'meta.total_found', 0);
Спасибо, мета информация помогла, но не в случае с фасетами. При попытке извлечь данные:

Код: Выделить всё

var_dump($dataProvider->facets);
Выдал ошибку об отсутствии 'distance', т.к. он пытается выполнить запрос
yii2-sphinx/activeDataProvider::prepareTotalCount() :

Код: Выделить всё

 
return (int) $query->limit(-1)->offset(-1)->orderBy([])->facets([])->showMeta(false)->count('*', $this->db);
Я так понимаю мой select меняется на count(*), в следствии чего where уже не работает для distance.
Кто нибудь сталкивался с такой проблемой? Как можно обойти замену select ?
AlienMans
Сообщения: 19
Зарегистрирован: 2017.05.03, 18:06

Re: Yii2 sphinx, limit 20, ну максимум 1000, нужно больше.

Сообщение AlienMans »

Может вернете

Код: Выделить всё

$data = Index::find()->asArray()->all();
А потом

Код: Выделить всё

count ($data);
Много учусь Web-разработке. Получается.
Ищу ментора на добровольно принудительной основе))).
Leffken
Сообщения: 115
Зарегистрирован: 2015.07.10, 15:49
Откуда: yola
Контактная информация:

Re: Yii2 sphinx, limit 20, ну максимум 1000, нужно больше.

Сообщение Leffken »

AlienMans писал(а): 2017.06.13, 13:18 Может вернете

Код: Выделить всё

$data = Index::find()->asArray()->all();
А потом

Код: Выделить всё

count ($data);
Я при помощи запроса формирую ActiveDataProvider (далее itemList на страницу). Мне это количество не очень нужно, оно нужно провайдеру, а провайдер хочет получать его при помощи count(*).

UPD видимо и ActiveDataProvider может брать информацию из meta)) Добавил ->showMeta(true) и все заработало!
Ответить