Доброго времени суток!
Хочу поделиться способом нахождения похожих по Тегам элементов ИБ. Способ будет полезен для вывода списка похожих статей в детальной странице статьи.
В коде происходит выборка 30 элементов, первыми из которых пойдут элементы у которых есть совпадения тегов "Personal" и "2020", далее хотя бы одного из этих двух Тегов, и в конце статьи, не имеющие совпадений.
По желанию можно добавить условие фильтра для выборки только тех элементов, которые содержат хоть один Тег. Например, условие по одному Тегу будет выглядеть так:
Пример запроса SQL:
В результате получим такие данные sql запроса:
Данные выборки через API
Надеюсь статья окажется полезной.
Хочу поделиться способом нахождения похожих по Тегам элементов ИБ. Способ будет полезен для вывода списка похожих статей в детальной странице статьи.
$obElements = \Bitrix\Iblock\ElementTable::getList([
'order' => [
'TAGS_COMPLIANCE_SORT'=>'DESC',
"SHOW_COUNTER" => "DESC"
],
"filter" => [
"=IBLOCK_ID" => 18,
"=ACTIVE" => "Y"
],
"sel ect" => [
"TAGS_COMPLIANCE_SORT",
"NAME",
"SORT",
"SHOW_COUNTER"
],
'runtime' => [
new \Bitrix\Main\Entity\ExpressionField(
'TAGS_COMPLIANCE_SORT',
"(case when LOCATE('Personal', TAGS)>0 then 1 else 0 end) + (case when LOCATE('2020', TAGS)>0 then 1 else 0 end)"
)
],
"limit" => 30
]);
while ($arElement = $obElements->fetch()) {
echo '<br><br><pre>' . __FILE__ . '<br>' . print_r($arElement, true) . '</pre>';
}
|
По желанию можно добавить условие фильтра для выборки только тех элементов, которые содержат хоть один Тег. Например, условие по одному Тегу будет выглядеть так:
array( "LOGIC" => "OR", array( '%TAGS' => " ".$sTagName."," // строка целиком в середине ), array( 'TAGS' => $sTagName.",%" // строка целиком в начале ), array( 'TAGS' => "% ".$sTagName // строка целиком в конце ), array( 'TAGS' => $sTagName // единственная строка в тегах ) ) |
Пример запроса SQL:
select ((case when LOCATE('Personal', TAGS)>0 then 1 else 0 end) + (case when LOCATE('2020', TAGS)>0 then 1 else 0 end)) as SORT,
TAGS, ID fr om b_iblock_element WHERE IBLOCK_ID=18 ORDER BY SORT DESC LIMIT 0, 30;
|
В результате получим такие данные sql запроса:
Данные выборки через API
Надеюсь статья окажется полезной.
можно в идее так же ссылку на данную статью оставить