Переводы Laravel

#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 . Помимо этой небольшой проблемы, это правильное решение, и оно будет принято 🙂