Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 25.10.2017 15:52:52

Запрос одним разом

Всем привет. Есть 2 таблицы: home_items и home_item_translations. Как вы, наверно, поняли, 2-ая зависит от 1-го. Чтобы сделать запрос вида:

SELECT
  home_items.alias,
  home_item_translations.text
FROM 
  home_items
LEFT JOIN home_item_translations on home_item_translations.home_item_id = home_items.id

... мне нужно записать:

$homeItem = HomeItem->get();

echo $homeItem[0]->alias;
echo $homeItem[0]->text;
echo $homeItem[1]->alias;
echo $homeItem[1]->text;
//...

При обращении к text делается запросна базу. В результате получается больше одного запроса, хотя, мне кажется, можно обойтись только одним.

P.S.
Версия Laravel 5.2
Версия PHP 7.0

ПОдскажите пожалуйста, как можно сделать вышеприведенный запрос в Laravel

Не в сети

#2 28.10.2017 15:18:22

Re: Запрос одним разом

Как-то у вас все сложно. Не совсем понятно конечная задача, но подход такой:

1. Создайте 2 модели HomeItem, HomeItemTranslate
2. Создайте в них связи: В модели HomeItem:

public function translations() {
   return $this->hasMany(HomeItemTranslate::class);
}

В HomeItemTranslate:

public function homeItem() {
   return $this->belongsTo(HomeItem::class);
}

4. В контроллере делайте выборку: $homeItem = HomeItem::with('translations')->find(1). Если нужно изменить респонс, используйте к примеру Laravel API Resources, fractal или написать класс в который трансформирует в нужный вам ответ.
Если вам нужно сохранить тогда: $homeItem = HomeItem::find(1); $hoteItem->translations()->create(array $translations).

Предположу что translations нужно постоянно отдавать, поэтому в модели можно сделать $with = ['translations']

Изменено andrei24 (28.10.2017 15:18:56)

Не в сети

#3 31.10.2017 23:42:36

Re: Запрос одним разом

В контроллере делайте выборку: $homeItem = HomeItem::with('translations')->find(1).

ваши варианты берут только один и делают при этом 2 запроса.
решил использовать

->join('home_item_translations','home_item_translations.home_item_id','=','home_items.id')

Не в сети

Подвал раздела