Я выполняю поиск с использованием Laravel и Ajax. Поэтому у меня есть Продукт, принадлежащий тегу и подкатегории. С другой стороны, подкатегория относится к категории. Я хочу проверить все их свойства (значения полей) и проверить, содержат ли они данную строку. С некоторыми поисками я узнал, что я должен использовать LIKE
. Вот что я пробовал:
$products = Product::where('name_en', 'LIKE', $search)->get();
Однако это приведет к получению продуктов, если строка поиска точно соответствует значению. Я хочу соответствовать, если он содержит его. Как я могу перейти к отношениям, связанным с этим? Как я могу проверить пропозиции Tag и Subcategory? Как объединить все вместе, чтобы достичь желаемого результата? Заранее спасибо.
вы делаете одно не так, ваш запрос возвращает вам точные совпадения, потому что вы указали точную строку. Но ваш запрос должен быть таким.
$products = Product::where('name_en', 'LIKE', '%'.$search.'%')->get();
Над запросом будут представлены ваши продукты, содержащие искомую строку.
И если вы хотите искать в реляционных таблицах, вы можете использовать метод laravel для joan join()
. Но есть еще один метод whereHas
но я всегда избегаю этого метода, потому что он создает очень сложный запрос. который очень тяжелый. Таким образом, вы можете использовать метод join()
который добавит inner join
с реляционной таблицей.
Вот пример соединения:
$products = Product::join('tags', function($builder) { $builder->on('tags.id', '=', 'products.tag_id'); // here you can add more conditions on tags table. }) join('sub_categories', function($builder) { $builder->on('sub_categories.id', '=', 'products.tag_id'); // here you can add more conditions on subcategories table. }) ->where('name_en', 'LIKE', '%'.$search.'%') ->get();
Это основной пример, вы можете использовать его в соответствии с вашим требованием.
Чтобы добавить к ответу Lakhwinder Singh , может быть, стоит обернуть его в область, которую вы можете применить к своей модели:
class Product extends Model { public function scopeSearch($query, $keywords) { return $query->where('name_en', 'LIKE', '%'.$keywords.'%'); } }
Затем вы можете использовать эту область следующим образом:
$products = Product::search($keywords)->get();
Это означает, что вам не нужно вручную добавлять условия «LIKE» во всем приложении.
Как и в стороне, Laravel представляет Scout, основанное на драйверах полнотекстовое расширение поиска для Eloquent, в версии 5.3.
Если у вас нет контроля над значением в $search
, важно защитить себя от SQL-инъекции .
Хороший способ сделать это:
$products = Product::whereRaw('name_en LIKE', ['%'.$search.'%'])->get();
То, что вы хотите, это написать расширенный запрос для поиска продукта на основе связанных моделей тоже, так как предыдущее предложение других, вам нужно написать заявления о соединении.
Проверьте приведенный ниже пример кода, который написан для поиска членов, строка поиска также приведет членов, если строка соответствует, навыки участников или позиции, так что это, безусловно, поможет вам.
$users = User::select('app_users.*') ->distinct() ->join('app_members', 'app_users.id', '=', 'app_members.app_users_id') ->leftJoin('app_members_jobtitles', 'app_members.id', '=', 'app_members_jobtitles.app_members_id') ->leftJoin('app_jobtitles', 'app_members_jobtitles.app_jobtitles_id', '=', 'app_jobtitles.id') ->leftJoin('app_members_tags', 'app_members.id', '=', 'app_members_tags.app_members_id') ->leftJoin('app_technologies', 'app_members_tags.app_technologies_id', '=', 'app_technologies.id') ->whereNull('app_users.activation') ->where('app_users.block','=',0) ->where(function ($query)use ($search) { $query->orWhere('app_users.first_name', 'like', '%'.$search.'%') ->orWhere('app_users.last_name', 'like', '%'.$search.'%') ->orWhere('app_members.company', 'like', '%'.$search.'%') ->orWhere('app_members.job_title', 'like', '%'.$search.'%') ->orWhere('app_jobtitles.title', 'like', '%'.$search.'%') ->orWhere('app_technologies.title', 'like', '%'.$search.'%') ->orWhere('app_members.summary', 'like', '%'.$search.'%'); }) ->get();
Обратите внимание на следующее соединение в приведенном выше коде, которое находится в вашей категории и подкатегории
->leftJoin('app_members_jobtitles', 'app_members.id', '=', 'app_members_jobtitles.app_members_id') ->leftJoin('app_jobtitles', 'app_members_jobtitles.app_jobtitles_id', '=', 'app_jobtitles.id')