Laravel 将嵌套集合提取到根集合

Laravel pluck nested collection to root collection

我有一个如上图所示的数据结构。
我想要根集合中用户字段中的一些字段,但我不知道如何才能得到。

public function index (Request $request) {
    $draw = $request->get('draw');
    $start = $request->get('start');
    $length = $request->get('length');

    $order = Order::with('user');
    $total_order = $order->count();
    $orders =  Order::with('user')->offset($start)->limit($length)->get();

    /*$draw = ceil($total_order/$length);*/
    return response()->json([
        'draw' => $draw,
        'recordsTotal' => $total_order,
        'recordsFiltered' => $total_order,
        'data' => $orders,
    ]);
}

平面图方法看起来很奇怪,您有两个模型 Order 和 Users,要么您必须即时向订单添加额外的属性,如果您想再次保存模型,这在 Laravel 中很奇怪。或者您必须将其转换为数组,这样您就失去了模型功能。

而不是试图将用户对象扁平化到订单上。您已经在使用 with(),因此您的用户已经迫不及待地加载并且可以依赖它。而是使用 Eloquent Getters 并将您的用户字段映射到订单。

class Order extends Model
{
    public function getUserNameAttribute() {
        return $this->user->name;
    }
}

Eloquent getters 函数名称必须采用 getPropertyAttribute 格式。现在你可以像这样访问它了,这也可以在 blade 等中完成。

foreach ($orders as $order) {
    $userName = $order->userName;
} 

如果你真的想要根集合中的相关值,你可以在 table:

上进行左连接
$orders = Order::leftJoin('users', 'users.id', '=', 'orders.user_id')

(根据模型名称,这些将是正确的 table 和列名称)。

然而,正如 Mrhn 刚才指出的那样,尝试在主模型的根集合中包含相关 table 的数据并不是很 Eloquent。

P.S。如果你确实使用left join,一定要只select你需要的数据,否则覆盖Order数据(比如id