Laravel по-русски

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

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

#1 Re: Laravel 5.x » Как сократить код выборки с промежуточной таблицы? Задать » 24.03.2018 08:49:01

Все догнал как сократить чтобы немного меньше было запросов в бд

$arr = [];
        $directions = Direction::where('id_user', Auth::user()->id)->get();
        foreach ($directions as $value){
            $execute = Direction::find($value->id)->executes()->get();
            foreach ($execute as $key => $item){
                $arr[$value->id]['name'] = $value->name;
                $arr[$value->id]['execute'][$item->id]['name'] = $item->name;
                $arr[$value->id]['execute'][$item->id]['last_name'] = $item->name;

            }
        }

#2 Re: Laravel 5.x » Как сократить код выборки с промежуточной таблицы? Задать » 24.03.2018 08:31:17

Или хотя можно обойти этот момент, сейчас попробую один и отпишу что вышло

#3 Re: Laravel 5.x » Как сократить код выборки с промежуточной таблицы? Задать » 24.03.2018 08:27:34

Я думаю что этот говнокод все равно придется использовать слишком много запросов. Потому что других решений я вообще не вижу как можно обойтись, если конечно во вьюшке не фигачеть запросы

#4 Re: Laravel 5.x » Как сократить код выборки с промежуточной таблицы? Задать » 24.03.2018 08:13:56

Ну я получил значение но там опять встает вопрос как запихнуть в коллекцию id direction чтобы был и name direction. Потому что как в скриншоте который я отправлял он не будет соответствовать и проще делать не связь а foreach весь массив строить. Верно?
То есть сейчас у меня выходит вот что

keys => [
[$keys(execute) => [
   //Все данные execute таблицы
 ]
]
...
]

А нужно чтобы было примерно так

id_direction => [
  name => direction.name,
  execute => [
   execute_id => [
     //Все данные таблицы execute соответствующему ключу
   ],
//Следующие id execute
  ]
],
//Следующие direction

ТО есть если я возьму даже то что выводит я не смогу их в blade склейть в единую, чтобы отображалось именно так как было в скриншоте. А именно
direction
  name execute
  name execute
и т.д. Затем опять другой direction идет. И при этом еще нужно не только название брать но и id потому что будет там удаление этой записи через ajax.

#5 Re: Laravel 5.x » Как сократить код выборки с промежуточной таблицы? Задать » 23.03.2018 22:19:38

Если только так примерно реализовать

$directions = Direction::where('id_user', Auth::user()->id)->get();
        foreach ($directions as $value){
            $arr[] = Direction::find($value->id)->executes()->get();
        }

#6 Re: Laravel 5.x » Как сократить код выборки с промежуточной таблицы? Задать » 23.03.2018 22:04:23

Если я правильно понял, то так не получается сделать потому что

class Direction extends Model
{
    protected $table = 'direction';
    protected $fillable = ['id_user', 'name'];

    public function executes()
    {
        return $this->belongsToMany('Growth\Execute', 'execute_direction');
    }
}

И в

$directions = Direction::where('id_user', Auth::user()->id)->get();
        dd($directions->executes());

То все равно не получится там нужен find()

#9 Re: Laravel 5.x » Как сократить код выборки с промежуточной таблицы? Задать » 23.03.2018 14:37:24

Да стоит связь, то есть в таблице execute_direction direction_id к таблице direction id И execute аналогичн. Только я не пойму как использовать relation. Как я понял многие ко многим то не понятно как в данном методе его использовать

#10 Laravel 5.x » Как сократить код выборки с промежуточной таблицы? Задать » 19.03.2018 18:12:17

rusline
Ответов: 15

Я примерно получил ответ, в том формате который нужен, только он громоздкий и много запросов требует, мне бы его сократить. Пробовал связанные таблицы пока что ничего подходящего не нашел, чтобы сделать так как мне нужно, возможно не смог рассмотреть все методы.
Но принцип мне нужен примерно вот такой массив или объект

id_direction: [
   name: name->direction
   execute: [
     id_execute: [
        id: id_execute
        name: name_execute
        last_name: last_name_execute
     ]
     id_execute: [
        id: id_execute
        name: name_execute
        last_name: last_name_execute
     ]
     ...
  ]
]
....

Если объяснить, то примерно так, что имеется направление допустим тренинги (таблица direction) и у него имеется ну допустим 5 исполнителей(таблица execute) потом есть направление семинары(direction) и у него 3 исполнителя(execute) и так далее весь список вывожу и во вьюшки их включаю
В таблицу
direction
id | name | id_user
execute
id | last_name | name | id_user
direction_execute
execute_id | direction_id
Я так и не смгог из реляционной моделе что-то сделать и сделал для примеру такой и наглядный код, который дает этот результат

$id_direction = [];
        //Получаем id direction c условие что вывести все значение у авторизованного пользователя
        $directions = Direction::where('id_user', Auth::user()->id)->get();
        foreach ($directions as $value){
            // Сравниваем id который получили из моделе direction с промежуточной таблицы Execute_direction
            $directionExecute = Exectue_direction::where('direction_id', $value->id)->get();
            foreach ($directionExecute as $item){
                //Получаем всех execute c который id direction должен совпадать
                $executes = Execute::where('id', $item->execute_id)->get();
                foreach ($executes as $key => $execute){
                    // Выходит многомерный массив из следующий данных id_direction -> id_execute и вписываем id name и last name в массив
                    $id_direction[$value->id]['name'] = $value->name;
                $id_direction[$value->id]['execute'][$item->execute_id]['id'] = $execute->id;
                $id_direction[$value->id]['execute'][$item->execute_id]['name'] = $execute->name;
                $arr[$value->id]['execute'][$item->execute_id]['last_name'] = $execute->last_name;
                }
            }

        }

        dd($id_direction);

Только минус он громоздкий, слишком много хапросов идет в бд. А возможно его сократить и чтобы меньше запросов было в бд?
Примерно во вьюшке должно получится вот такой вид https://yadi.sk/i/LD1H5tjB3TZFHL
Где Вначале идет направление(direction) и списком идут исполнители(execute)

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