надо.
Вот, например, криво формирует sql запрос при поиске с tvd:
$res = SiteContent::query()
->withTvs(['product_vendor'])
->tvFilter('tvd:product_vendor:=:0')
->take(3)
->get();
Формирует
Unknown column 'ba_tvd_product_vendor.default_text' in 'where clause' (SQL: select `ba_site_content`.*, `ba_tv_product_vendor`.`value` as `product_vendor` from `ba_site_content` left join `ba_site_tmplvar_contentvalues` as `ba_tv_product_vendor` on `ba_site_content`.`id` = `ba_tv_product_vendor`.`contentid` and `ba_tv_product_vendor`.`tmplvarid` = 85 where IFNULL(`ba_tv_product_vendor`.`value`, `ba_tvd_product_vendor`.`default_text`) = and `ba_site_content`.`deleted` = 0 group by `ba_tv_product_vendor`.`value`, `ba_site_content`.`id` limit 3)
А надо
select `ba_site_content`.*, `ba_tv_product_vendor`.`value` as `product_vendor`
from `ba_site_content`
left join `ba_site_tmplvar_contentvalues` as `ba_tv_product_vendor` on `ba_site_content`.`id` = `ba_tv_product_vendor`.`contentid` and `ba_tv_product_vendor`.`tmplvarid` = 85
left join `ba_site_tmplvars` as `ba_tvd_product_vendor` on `ba_tvd_product_vendor`.`id` = 85
where IFNULL(`ba_tv_product_vendor`.`value`, `ba_tvd_product_vendor`.`default_text`) = 0 and `ba_site_content`.`deleted` = 0
group by `ba_tv_product_vendor`.`value`, `ba_site_content`.`id`
limit 3;
Разница:
1. нет ba_tvd_product_vendor
2. результат функции IFNULL сравнивается с ничем
Кто-то делал поиск с tvd, работает?
Советую ознакомиться: evoSearch
В моем исходном варианте было product_vendor:d
а можно подробнее? не понял что куда
withTVs[product_vendor:d]
Вот тут оказалось, что проблема в модели SiteContent. Берём код: $res = SiteContent::query() ->withTvs(['product_vendor']) ->tvFilter('tvd:product_vendor:=:0') ->take(3) ->get(); Значение tv-шки product_vendor по умолчанию 0. Ищем ресурсы, у которых эта tv-шка не заполнена. Запрос выглядит нормально, но не выдаёт ничего. Оказалось проблема в том, что значение в модели проверяется с помощью empty, а оно при сравнении с 0 даёт false. $parts = explode($innerSep, $filter, 5); $type = $parts[0]; $tvname = $parts[1]; $op = $parts[2]; $value = !empty($parts[3]) ? $parts[3] : ''; // !!! ВОТ ТУТ !!! $cast = !empty($parts[4]) ? $parts[4] : ''; Есть костыль, можно писать "0" вместо 0 и sql это нормально жрёт. А так конечно надо поправить модель, заменить empty на isset.
Можно убрать совместимость с php5 и вообще сделать $value = $parts[3] ?? '';
Да, типа того. Ещё есть ?: (это Элвис). Я вчера/позавчера смотрел что для чего, но сейчас не помню разницу
Элвис сравнивает с true-значением , вопросы - как раз isset.
а проинформируй плз, что в итоге? ишу отправил? или как там дальше с этим?
сделал PR для исправления
Обсуждают сегодня