在一个维度上连接来自另一模型的单个列

时间:2019-02-17 23:54:17

标签: laravel eloquent

我需要为datatables.net提供一维结果。

说我有这两个模型:

CustomerModel

class CustomerModel extends \sys\Model
{
    public $timestamps = false;

    protected $table = 'Customer';
    protected $primaryKey = 'customerId';

    protected $hidden   = [];
    protected $guarded  = [ 'customerId' ];


    public function paymentMethod(){
        return $this->hasOne('\app\model\PaymentMethodModel' , 'paymentMethodId' , 'paymentMethodId');
    }


    protected $fillable =
    [
       'customerName', 'address'
    ];          

}

PaymentMethodModel

class PaymentMethodModel extends \sys\Model
{
    public $timestamps = false;

    protected $table = 'PaymentMethod';
    protected $primaryKey = 'paymentMethodId';

    protected $hidden   = [];
    protected $guarded  = [ 'paymentMethodId' ];
    protected $fillable =
    [
       'paymentMethodName'
    ];          


}

如果我选择使用AgentModel::with(['paymentMethod']);之类的CustomerModel 我会得到:

{
    "customerID": 1,
    "customerName": "John Doe"
    "address": "London"
    "payment_method": 
     {
         "paymentMethodId": 1,
         "paymentMethodName" : "Cash"
     }     
}

我想要实现的是将paymentMethodName作为平面对象放入结果中 像这样:

{
    "customerID": 1,
    "customerName": "John Doe"
    "address": "London"
    "paymentMethodName" : "Cash"  
}

是否希望在不使用原始查询的情况下实现“ Laravel”方式?

1 个答案:

答案 0 :(得分:1)

使用Laravel API资源是一个很好的用例,它可以将模型转换为Api响应,请在API Resources处阅读文档。

这很简单,首先要构建资源,将其称为客户资源。这会将您的模型转换为JSON响应。如果您为某些旧代码创建包装,这也很有用,那么您可以轻松地将模型转换为新结构。

use Illuminate\Http\Resources\Json\JsonResource;

class CustomerResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'customerID' => $request->customerId,
            'customerName' => $request->customerName,
            'address' => $request->address,
            'paymentMethodName' => $request->paymentMethod->paymentMethodName,
        ];
    }
}

然后在您的API控制器代码中,您可以像这样利用API资源。

return new CustomerResource($customerModel);

这似乎是一件很少的事情,但这是一种解决方案,当事情变得复杂时,可以为您带来很多帮助。当您处理多个模型,关系或相似模型时。如果人们感兴趣,这是首选方法,因为Fractal是一种不错的选择,因为它在Fractal Documentation API资源被使用之前是一个流行的选择。