Laravel по-русски

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

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

#1 19.03.2018 18:12:17

Как сократить код выборки с промежуточной таблицы? Задать

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

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)

Изменено rusline (20.03.2018 10:52:16)

Не в сети

#2 23.03.2018 14:26:14

Re: Как сократить код выборки с промежуточной таблицы? Задать

А в моделях связи между таблицами вы прописали?

Изменено n_osennij (23.03.2018 14:26:26)

Не в сети

#3 23.03.2018 14:37:24

Re: Как сократить код выборки с промежуточной таблицы? Задать

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

Не в сети

#4 23.03.2018 14:44:01

Re: Как сократить код выборки с промежуточной таблицы? Задать

return $directions->executes; (если связь так вызывается)

Не в сети

#5 23.03.2018 15:10:10

Re: Как сократить код выборки с промежуточной таблицы? Задать

Ладно попробую тогда и дам точный ответ. Так я еще не мыслил

Не в сети

#6 23.03.2018 15:15:16

Re: Как сократить код выборки с промежуточной таблицы? Задать

Не в сети

#7 23.03.2018 15:16:56

Re: Как сократить код выборки с промежуточной таблицы? Задать

Зачем мне это видео про композер?

Не в сети

#8 23.03.2018 15:20:39

Re: Как сократить код выборки с промежуточной таблицы? Задать

Это первое видео серии. Хорошие курсы по laravel. Первые 2 видео можно пропустить.

Не в сети

#9 23.03.2018 22:04:23

Re: Как сократить код выборки с промежуточной таблицы? Задать

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

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()

Не в сети

#10 23.03.2018 22:19:38

Re: Как сократить код выборки с промежуточной таблицы? Задать

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

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

Не в сети

#11 23.03.2018 23:42:23

Re: Как сократить код выборки с промежуточной таблицы? Задать

Так. Давайте разберёмся ещё раз.
Есть таблица direction (тренинги) и таблица execute (исполнители). И таблица многие ко многим direction_execute, где описываются связи - на каких тренингах какие исполнители, какие исполнители на каких тренингах.
Верно? Хорошо. А теперь скажите, что вы хотите получить?

Не в сети

#12 24.03.2018 08:13:56

Re: Как сократить код выборки с промежуточной таблицы? Задать

Ну я получил значение но там опять встает вопрос как запихнуть в коллекцию 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.

Не в сети

#13 24.03.2018 08:27:34

Re: Как сократить код выборки с промежуточной таблицы? Задать

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

Изменено rusline (24.03.2018 08:27:48)

Не в сети

#14 24.03.2018 08:31:17

Re: Как сократить код выборки с промежуточной таблицы? Задать

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

Не в сети

#15 24.03.2018 08:49:01

Re: Как сократить код выборки с промежуточной таблицы? Задать

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

$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;

            }
        }

Не в сети

#16 24.03.2018 11:17:41

Re: Как сократить код выборки с промежуточной таблицы? Задать

чтобы данные "отдать" в нужном виде придумали Ресурсы - https://laravel.com/docs/5.6/eloquent-resources. В контроллере вы просто получаете данные. И отдаёте Ресурсу.

И вы так и не ответили  на мой вопрос касательно связи между таблицами. Таблица промежуточная должна называться наоборот - direction_execute (по алфавиту). Тогда достаточно создать только две модели и очистить их от мусора

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

    public function executes()
    {
        return $this->belongsToMany('Growth\Execute');
    }
}
class Executer extends Model
{
    public function directions()
    {
        return $this->belongsToMany('Growth\Direction');
    }
}

Теперь можно как-то так. И отдать Ресурсу.
$directions = Direction::with('executes')->where('id_user', Auth::user()->id)->get();

Не в сети

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