Laravel присоединиться использовать, чтобы получить один ко многим отношениям? - PullRequest
0 голосов
/ 11 июля 2019

Есть ли способ получить реляционные данные (от одной до нескольких записей отношений), используя объединения в laravel, не создавая разные записи в коллекции:

Пример:

 $orders  = DB::table('orders')
                     ->join('users', 'users.id', '=', 'orders.users_id')
                     ->join('order_items', 'order_items.order_id', '=', 'orders.id')
                     ->select('users.*', 'order_items.*')
                     ->get();

Итак, что происходитявляется то, что он создает 6 записей, если в заказе есть 6 элементов, но я хочу что-то вроде отдельных записей, в которых он имеет массив или коллекцию, где перечислены элементы заказа.

Вывод, который я хочу, обычно имеет следующий порядок:

Collection {# ▼
  #items: array:[▼
          0 => {
            +'id':1,
              ...,
            + 'items: [
                     //here i want all the records of relation order items
           ]
      }
 ]
}

Есть ли способ достичь этого результата без использования с () или load () и только с соединениями или необработанными запросами?

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

Этот ответ носит умозрительный характер, но, возможно, вы хотите сообщить одну строку для каждого пользователя со списком элементов CSV:

$orders = DB::table('orders AS o')
    ->join('users AS u', 'u.id', '=', 'o.users_id')
    ->join('order_items AS oi', 'oi.order_id', '=', 'o.id')
    ->select('u.id', DB::raw('GROUP_CONCAT(oi.name) AS orders'))
    ->groupBy('u.id')
    ->get();
0 голосов
/ 11 июля 2019

Если нет никаких причин, мешающих вам использовать Eloquent, это лучший способ работы с базами данных.

Eloquent ORM, включенный в Laravel, обеспечивает красивый, простой Реализация ActiveRecord для работы с вашей базой данных

Вот документация Eloquent: начало работы

Модель отношений упрощена в laravel, вы можете получить следующее:

Отношения модели пользователя:

//user orders
public function orders() {
    return $this->hasMany('App\Order');
}

Модель отношений отношений:

//order items
public function items() {
    return $this->hasMany('App\OrderItem');
}

//order owner
public function user() {
    return $this->belongsTo('App\User');
}

Отношения модели OrderItem:

//order
public function order() {
    return $this->belongsTo('App\Order');
}

Вот краткий пример того, как вы можете получить предметы заказа

$orders = User::find($id)->orders
foreach($orders as $order) {
    $orderItems = $order->items;
}

вы можете сделать коллекцию так, как вам нравится, но настоятельно рекомендуем использовать Eloquent Resources , так как большинство приложений в настоящее время ожидают ответов JSON.

0 голосов
/ 11 июля 2019

Вы должны попробовать это:

$orders  = DB::table('orders')
                     ->select('users.*', 'order_items.*')
                     ->leftJoin('users', 'users.id', '=', 'orders.users_id')
                     ->leftJoin('order_items', 'order_items.order_id', '=', 'orders.id')
                     ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...