Yii2. Как сделать выборку записей из БД по условию?

Задача такая, нужно выбрать из БД все книги у которых есть определенный тег. В БД у каждой книги есть поле tags в нем теги записаны следующим образом: "1,5,7,12". Т.е. просто цифры перечисленные через запятую. В модели создаю такую функцию:
public static function getBooksByTag($tag)
    {
           return Books::find()->where(in_array($tag, explode(',', 'tags')))->all();
    }

По замыслу вызываю функцию в любом месте, и получаю список нужных книг. На деле такая реализация не работает. Функция всегда возвращает все книги. Как допилить эту функцию до ума? Что я тут делаю не так?

Можно конечно в лоб пойти, через foreach перебрать все книги, у каждой книги перебрать все теги сверяя их с искомым. Просто хочется разобраться с той функцией выше

Upd. Сейчас сделал так. Все работает как надо. Но нельзя ли сделать элегантнее?
public static function getBooksByTag($tag)
{
   $books = Books::find()->all(); //выгребаем все книжки
   $books_id[]=null; //это будет массив с id-шниками книг у которых есть нужные теги
    foreach ($books as $book){ 
        if (in_array($tag, explode(',', $book->tags))){  //проверяем есть ли наш тег в списке тегов книги
            $books_id[]=$book->id; //если тег есть, то добавляем id книги к нашему массиву  
         }
    }
return Books::findAll($books_id); //возвращаем все найденные книги
}
  • Вопрос задан
  • 1769 просмотров
Пригласить эксперта
Ответы на вопрос 5
zetamen
@zetamen
В поисках нового
Конкретно по задаче
public static function getBooksByTag($tag)
{
    $pattern = "(^{$tag}$)|(^{$tag},)|(,{$tag},)|(,{$tag}$)";
    return Books::find()->where("tags REGEXP '{$pattern}'")->all();
}


А по-хорошему список тегов должен хранится в отдельной таблице и доставаться через связи
Ответ написан
@primitiveko
var_dump(explode(',', 'tags')) проверьте

$this->tags мб?
Ответ написан
@rowdyro
что-то непонятное делаете

in_array возвращает true.
return Books::find()->where(['tags'=>implode(",", $tag)])->all();
Ответ написан
miraage
@miraage
Старый прогер
Начнем с того, что не самым лучшим образом реализовали книги/тэги.
Вы зашиваете их в книгу, хотя надо было сделать через many-to-many.

books: id, title, ...
tags: id, title, ...
books_tags: book_id, tag_id
Ответ написан
Mikhail Osher, а почему человек не самым лучшим образом реализовал? Почему надо many-to-many? Лишняя таблица появляется в базе данных.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Max.Credit Санкт-Петербург
от 150 000 до 300 000 ₽
4People Санкт-Петербург
от 170 000 ₽
22 окт. 2021, в 17:07
2000 руб./за проект
22 окт. 2021, в 16:49
5000 руб./за проект