例如我们有用户和标签模型
用户:
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' 相关数据。
有什么我不明白的吗?
您遇到的问题源于
$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);
}
我希望这有帮助!