#php #laravel #laravel-livewire
Вопрос:
может кто-нибудь сказать мне, как я могу искать (с помощью livewire) продукты, название которых можно перевести? В настоящее время я использую astrotomic/laravel-translatable
пакет. Переводы работают просто отлично, и я могу статически извлекать правильные данные, но когда я пытаюсь найти их, у меня возникает проблема, потому что пакет ожидает, что заголовок будет в другой таблице, а не в основной products
таблице.
Вот фрагменты кода.
Таблица переводимых полей продукта:
Schema::create('product_translations', function (Blueprint $table) { $table-gt;id(); $table-gt;string('locale')-gt;index(); $table-gt;foreignId('product_id')-gt;constrained()-gt;onDelete('cascade'); $table-gt;string('title'); $table-gt;timestamps(); });
Таблица основных продуктов:
Schema::create('products', function (Blueprint $table) { $table-gt;id(); $table-gt;foreignId('category_id')-gt;constrained()-gt;onDelete('cascade'); $table-gt;foreignId('user_id')-gt;constrained()-gt;onDelete('cascade'); $table-gt;timestamps(); });
В первую таблицу мне нужно поместить только те данные, которые можно перевести, а в основную таблицу продуктов я должен поместить только те данные, которые не нужно переводить
Просто не писать весь процесс создания продуктов и т. Д. Я сделаю короткую заметку о том, как это работает.
Когда я создам 1 продукт, он будет прокручивать доступные локали config.app и создавать для всех языков один и тот же продукт (одно и то же название), затем мы сможем выбрать разные языки и перевести его на основе этого.
Когда я хочу извлечь статические данные, это выглядит так:
$products = Product::select('id', 'category_id', 'price', 'created_at', 'image') -gt;whereHas('translations', function ($query) { $query-gt;where('locale', app()-gt;getLocale()); }) -gt;with('category:id,name') -gt;orderBy('category_id', 'asc') -gt;get();
Теперь я хочу выполнить поиск в реальном времени с помощью livewire, но не могу вытащить заголовок, подобный этому:
$products = Product::select('id', 'category_id', 'price', 'created_at', 'image') -gt;whereHas('translations', function ($query) { $query-gt;where('locale', app()-gt;getLocale()); }) -gt;when($this-gt;searchProducts != '', function($query) { $query-gt;where('title', 'like', '%'.$this-gt;searchProducts.'%'); }) -gt;with('category:id,name') -gt;orderBy('category_id', 'asc') -gt;get();
потому что название находится в другой таблице.
Есть какие-нибудь идеи? Спасибо
Ответ №1:
Я не проверял это, но может сработать
$products = Product::select('id', 'category_id', 'price', 'created_at', 'image') -gt;whereHas('translations', function ($query) use ($this-gt;searchProducts) { if($this-gt;searchProducts) { $query-gt;where('locale', app()-gt;getLocale()); $query-gt;where('title', 'like', '%'.$this-gt;searchProducts.'%'); } }) -gt;with('category:id,name') -gt;orderBy('category_id', 'asc') -gt;get();
Комментарии:
1. Спасибо! Это отлично работает, есть только одно небольшое изменение, которое следует добавить, иначе laravel будет жаловаться на синтаксис. Вместо
$this-gt;searchProducts
этого нам нужно, например, создать новую переменную$searchedProducts = $this-gt;searchProducts
и использовать ее в тех местах, где мы должны ее использовать$this-gt;searchProducts
. Помимо этой небольшой проблемы, это правильное решение, и оно будет принято 🙂