Laravel oneToMany 转换数组和资源 -> 错误

问题描述 投票:0回答:1

例如我们有用户和标签模型

用户:

class User extends Model
{
    protected $casts = [
        'tags' => 'array',
    ];

    public function tags()
    {
        return $this->hasMany(Tag::class);
    }

}

标签:

class Tag extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }

}

和用户资源:

class UserResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'tags' => TagResource::collection($this->resource->tags),
        ];
    }
}

laravel 8.83

问题: 如果我设置 $casts 'tags' => 'array' 那么 $this->resource->tags 为 null。 如果我删除 $casts 中的 'tags' => 'array' 那么 $this->resource->tags 就有数据。

“在 null 上调用成员函数first()”如果使用 'tags' => 'array',我会看到这一点,但我的数据库具有用户和标签的 'oneToMany' 相关数据。

有什么我不明白的吗?

arrays laravel casting resources
1个回答
0
投票

您遇到的问题源于

$casts
属性和 Eloquent 关系之间的冲突。

用户模型:

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $casts = [
        // other casts
    ];

    public function tags()
    {
        return $this->hasMany(Tag::class);
    }
}

标签型号

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

用户资源模型

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'tags' => TagResource::collection($this->tags),
        ];
    }
}

标签资源模型

use Illuminate\Http\Resources\Json\JsonResource;

class TagResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            // other fields
        ];
    }
}

控制器

use App\Models\User;
use App\Http\Resources\UserResource;

public function show($id)
{
    $user = User::with('tags')->findOrFail($id);

    return new UserResource($user);
}

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.