Задача такая, нужно выбрать из БД все книги у которых есть определенный тег. В БД у каждой книги есть поле 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); //возвращаем все найденные книги
}