首页 > 解决方案 > 如何使用 laravel eloquent 从其他表中获取和显示数据

问题描述

我在我的控制器中使用这些代码从我的 2 个表中获取所有数据,它工作正常

$All = Customers::with('order')->paginate(10);

return response()->json([
    'code' => 0,
    'success' => true,
    'data' => $All
], 200);

这是我如何定义这两个表之间的关系

class Customers extends Model
{
    public function order()
    {
        return $this->hasMany(Orders::class, 'customer_id', 'id');
    }
}

class Orders extends Model
{
    public function customers()
    {
        return $this->belongsTo(Customers::class, 'customer_id', 'id');
    }
}

在此处输入图像描述

现在我希望的输出是隐藏订单 ID、订单时间戳并将 customer_id 更改为客户姓名(客户姓名不在我的订单数据库表中)。

'data' => DataResource::collection($All)在我的控制器中使用,这是我的DataResource

public function toArray($request)
{
    return [
        'id' => $this->id,
        'name' => $this->name,
        'created_at' => $this->created_at,
        'updated_at' => $this->updated_at,
        'order' => $this->order
    ];
}

当然,输出与上图相同。

我的数据库结构:

任何人都可以帮助我吗?

标签: phpmysqllaraveleloquent

解决方案


答案很简单,基本上是官方文档的副本。您只需要将您的订单OrderResource也包含在其中。

// DataResource
public function toArray($request)
{
    return [
        'id' => $this->id,
        'name' => $this->name,
        'created_at' => $this->created_at,
        'updated_at' => $this->updated_at,
        'order' => OrderResource::collection($this->order)
    ];
}

// OrderResource
public function toArray($request)
{
    return [
        'items' => $this->items,
        'quantity' => $this->quantity
    ];
}

我真的不明白为什么customer_name当它已经存在于上面一个层次结构的客户对象中时,你为什么要在你的订单中包含它。但是如果你真的想添加它,你应该可以这样做:'customer_name' => $this->customers->name

附带说明:您确实应该与您的命名更加一致。DataResource为什么在 about 时调用资源CustomersCustomers为什么以复数形式而不是单数形式调用您的模型Customer,这是惯例(如果您认为一个模型代表一个客户,则更合乎逻辑)。为什么当它返回一个客户时你的关系被称为belongsTo复数,而当它返回一个或多个订单时你的关系被调用?customers()hasManyorder


推荐阅读