Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Я примерно получил ответ, в том формате который нужен, только он громоздкий и много запросов требует, мне бы его сократить. Пробовал связанные таблицы пока что ничего подходящего не нашел, чтобы сделать так как мне нужно, возможно не смог рассмотреть все методы.
Но принцип мне нужен примерно вот такой массив или объект
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)
Не в сети
А в моделях связи между таблицами вы прописали?
Изменено n_osennij (23.03.2018 14:26:26)
Не в сети
Не в сети
return $directions->executes; (если связь так вызывается)
Не в сети
Не в сети
Не в сети
Не в сети
Это первое видео серии. Хорошие курсы по laravel. Первые 2 видео можно пропустить.
Не в сети
Если я правильно понял, то так не получается сделать потому что
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()
Не в сети
Если только так примерно реализовать
$directions = Direction::where('id_user', Auth::user()->id)->get();
foreach ($directions as $value){
$arr[] = Direction::find($value->id)->executes()->get();
}
Не в сети
Так. Давайте разберёмся ещё раз.
Есть таблица direction (тренинги) и таблица execute (исполнители). И таблица многие ко многим direction_execute, где описываются связи - на каких тренингах какие исполнители, какие исполнители на каких тренингах.
Верно? Хорошо. А теперь скажите, что вы хотите получить?
Не в сети
Ну я получил значение но там опять встает вопрос как запихнуть в коллекцию 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.
Не в сети
Я думаю что этот говнокод все равно придется использовать слишком много запросов. Потому что других решений я вообще не вижу как можно обойтись, если конечно во вьюшке не фигачеть запросы
Изменено rusline (24.03.2018 08:27:48)
Не в сети
Или хотя можно обойти этот момент, сейчас попробую один и отпишу что вышло
Не в сети
Все догнал как сократить чтобы немного меньше было запросов в бд
$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;
}
}
Не в сети
чтобы данные "отдать" в нужном виде придумали Ресурсы - 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();
Не в сети