Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Все догнал как сократить чтобы немного меньше было запросов в бд
$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;
}
}
Или хотя можно обойти этот момент, сейчас попробую один и отпишу что вышло
Я думаю что этот говнокод все равно придется использовать слишком много запросов. Потому что других решений я вообще не вижу как можно обойтись, если конечно во вьюшке не фигачеть запросы
Ну я получил значение но там опять встает вопрос как запихнуть в коллекцию 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.
Если только так примерно реализовать
$directions = Direction::where('id_user', Auth::user()->id)->get();
foreach ($directions as $value){
$arr[] = Direction::find($value->id)->executes()->get();
}
Если я правильно понял, то так не получается сделать потому что
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()
Я примерно получил ответ, в том формате который нужен, только он громоздкий и много запросов требует, мне бы его сократить. Пробовал связанные таблицы пока что ничего подходящего не нашел, чтобы сделать так как мне нужно, возможно не смог рассмотреть все методы.
Но принцип мне нужен примерно вот такой массив или объект
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)
Страницы 1