【问题标题】:Laravel relationship is not loading in Resource?Laravel 关系没有加载到资源中?
【发布时间】:2019-09-20 07:09:43
【问题描述】:

我想加载与客户的订单关系,但它在邮递员中返回null


客户模型

<?php

namespace App;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Customer extends Authenticatable implements JWTSubject
{
     use Notifiable;


    protected $fillable = [
        'first_name',
        'last_name',
        'phone_number',
        'postal_code',
        'email',
        'preferred_method_to_contact',
        'password',
        'address',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function getNameAttribute()
    {
        $name = $this->first_name . " " . $this->last_name;
        return $name;
    }

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

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

订单模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Order extends Model
{
    protected $fillable = [
            'first_name',
            'last_name',
            'email',
            'phone_number',
            'post_code',
            'address',
            'alternative_address',
            'property_type',
            'property_type_other',
            'contract_type',
            'contract_type_other',
            'no_of_bedrooms',
            'no_of_bathrooms',
            'customer_id',
            'best_day',
            'best_time',
            'type_of_cleaning',
        ];


    public function customers()
    {
        return $this->belongsTo('App\Customer');
    }
}

订单资源

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class OrderResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        /*return parent::toArray($request);*/
        return [
            'id' => $this->id,
            'first_name' => $this->first_name,
            'last_name' => $this->last_name,
            'email' => $this->email,
            'phone_number' => $this->phone_number,
            'post_code' => $this->post_code,
            'address' => $this->address,
            'alternative_address' => $this->alternative_address,
            'property_type' => $this->property_type,
            'property_type_other' => $this->property_type_other,
            'contract_type' => $this->contract_type,
            'contract_type_other' => $this->contract_type_other,
            'no_of_bedrooms' => $this->no_of_bedrooms,
            'phone_number' => $this->phone_number,
            'no_of_bathrooms' => $this->no_of_bathrooms,
            'customer' => new CustomerResource($this->whenLoaded('customers')),
        ];
    }
}

客户资源

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class CustomerResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
     public function toArray($request)
    {
        /*return parent::toArray($request);*/
        return [
            'id' => $this->id,
            'first_name' => $this->first_name,
            'last_name' => $this->last_name,
            'email' => $this->email,
        ];
    }
}

这是OrderController中负责发送JSON响应的函数

public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'first_name' => ['required', 'string', 'max:10'],
            'last_name' => ['required', 'string', 'max:10'],
            'email' => ['required', 'string', 'email', 'max:50'],
            'phone_number' => ['required', 'string', 'max:30'],
            'post_code' => ['required', 'string', 'max:30'],
            'address' => ['required', 'string', 'max:300'],
            'alternative_address' => ['required', 'string', 'max:300'],
            'property_type' => ['required', 'string', 'max:30'],
            'contract_type' => ['required', 'string', 'max:30'],
            'no_of_bedrooms' => ['required', 'string', 'max:30'],
            'type_of_cleaning' => ['required', 'string', 'max:30'],
            'best_day' => ['required', 'string', 'max:30'],
            'best_day' => ['required', 'string', 'max:30'],
        ]);

        if ($validator->fails()) {
            return response()->json($validator->errors(), 422);
        }

        // $customer = Customer::findOrFail($request->customer_id);
        $order = Order::create($request->all());
        // $order = Order::create();
        $order->load(array('customers'));

        return new OrderResource($order);
    }

我希望将客户详细信息与订单一起加载。

【问题讨论】:

  • 我认为您忘记在 OrderResource 文件中导入 CustomerResource 资源。
  • 是的..我没有。
  • 然后添加它,并检查你是否得到了relationhsip。
  • 没有变化。返回null
  • 我终于找到了关系。非常感谢您的回复

标签: php laravel laravel-6


【解决方案1】:

不知何故,我设法解决了这个问题。实际上ManyToOne 关系函数无法识别customerscustomers 函数以 many-to-one 为目标,因此根据 laravel 的标准,它应该是单数而不是复数。

public function customer()
{
   return $this->belongsTo('App\Customer');
}

同样在OrderController

$order->load(array('customer')); // <- make it singular as well

OrderResource

'customer' => new CustomerResource($this->whenLoaded('customer')), // <- make it singular

【讨论】:

  • 帮自己一个忙,不要快速修复它,而是通过重命名关系可持续地修复它。在可维护性方面,方法和变量的错误命名在有问题的错误列表中非常高。想想三年后再读一遍这段代码,同时寻找一个bug。当方法是复数形式时,您可能会忽略某些内容,因为您认为它返回的内容与实际返回的内容不同。例如foreach($order-&gt;customers as $customer) { ... } - 你不会很快发现错误...
  • @Namoshek 我已经更新了它,但为了将来参考和帮助其他人,我也更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2021-12-16
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
相关资源
最近更新 更多