使用 Eloquent 模型存储数据不起作用,调用未定义的方法
Storing data with Eloquent Model not working, Call to undefined method
我想用 Laravel 制作 Restful API 并且我想编写一个通过 CSV 文件的脚本,首先是 POST 动物,然后从响应中获取动物 ID 和 POST AnimalDate,但它没有按我想要的方式工作,我收到以下错误:
Call to undefined method App\Animal::getAnimalDateAttribute()
我有像 Animal 和 AnimalDate 这样的模型,我想像下面那样在 json 中显示响应,所以我使用了 Eloquent 资源和 JsonResource:
{
"id": 1,
"name": "Gilda Lynch",
"country": "MO",
"description": "Soluta maiores aut dicta repellat voluptas minima vel. Qui omnis assumenda maxime.",
"image": "http://www.abshire.com/",
"dates": [
{
"id": 6,
"date_from": "2019-11-25 04:03:44",
"date_to": "2019-09-30 05:47:28",
"animal_id": 1,
},
]
}
我认为问题出在 Animal 模型和 AnimalDate 模型之间,但我无法修复它,所以我正在寻求帮助。
这些模型之间的关系:Animal hasMany AnimalDate
class Animal extends Model
{
public function animalDates()
{
return $this->hasMany(AnimalDate::class);
}
}
AnimalDate 属于 Animal
class AnimalDate extends Model
{
public function animal()
{
return $this->belongsTo(Animal::class);
}
}
我创建了资源 - AnimalDateResource.php
class AnimalDateResource extends JsonResource
{
public function toArray($request)
{
return parent::toArray($request);
}
}
和动物资源:
class AnimalResource extends JsonResource
{
public function toArray($request)
{
// return parent::toArray($request);
return [
'id' => $this->id,
'name' => $this->name,
'country' => $this->country,
'description' => $this->description,
'image' => $this->image_url,
'dates' => AnimalDateResource::collection($this->animalDates)
];
}
}
在控制器中,我只使用 new AnimalResource($animal)
并且方法索引和显示效果完美。
是否有任何解决方案 POST 它像 Animal 然后是 AnimalDate,还是我必须先 POST 它然后通过 JsonResouce 显示关系?
如果是一对一,您可以直接访问与资源的关系。但是我不知道如果是多对一你是否可以访问关系。这东西对我有用。
public function toArray($request)
{
$newAnimalDates = array();
foreach($AnimalDates as $animalDates) {
$newAnimalDates[] = [
"id": $animalDates->id,
"date_from": $animalDates->date_from,
"date_to": $animalDates->date_to,
"animal_id": $animalDates->animal_id,
]
}
return [
'id' => $this->id,
'name' => $this->name,
'country' => $this->country,
'description' => $this->description,
'image' => $this->image_url,
'dates' => $newAnimalDates
];
}
好的,问题出在 AnimalController@store。
解决前:
public function store(Request $request)
{
$data = $request->all();
$animal = Animal::create($data);
return response()->json($animal, 201);
}
问题修复后:
public function store(Request $request)
{
$data = $request->all();
$animal = Animal::create($data);
// THIS LINE
return new AnimalResource($animal);
}
我想用 Laravel 制作 Restful API 并且我想编写一个通过 CSV 文件的脚本,首先是 POST 动物,然后从响应中获取动物 ID 和 POST AnimalDate,但它没有按我想要的方式工作,我收到以下错误:
Call to undefined method App\Animal::getAnimalDateAttribute()
我有像 Animal 和 AnimalDate 这样的模型,我想像下面那样在 json 中显示响应,所以我使用了 Eloquent 资源和 JsonResource:
{
"id": 1,
"name": "Gilda Lynch",
"country": "MO",
"description": "Soluta maiores aut dicta repellat voluptas minima vel. Qui omnis assumenda maxime.",
"image": "http://www.abshire.com/",
"dates": [
{
"id": 6,
"date_from": "2019-11-25 04:03:44",
"date_to": "2019-09-30 05:47:28",
"animal_id": 1,
},
]
}
我认为问题出在 Animal 模型和 AnimalDate 模型之间,但我无法修复它,所以我正在寻求帮助。
这些模型之间的关系:Animal hasMany AnimalDate
class Animal extends Model
{
public function animalDates()
{
return $this->hasMany(AnimalDate::class);
}
}
AnimalDate 属于 Animal
class AnimalDate extends Model
{
public function animal()
{
return $this->belongsTo(Animal::class);
}
}
我创建了资源 - AnimalDateResource.php
class AnimalDateResource extends JsonResource
{
public function toArray($request)
{
return parent::toArray($request);
}
}
和动物资源:
class AnimalResource extends JsonResource
{
public function toArray($request)
{
// return parent::toArray($request);
return [
'id' => $this->id,
'name' => $this->name,
'country' => $this->country,
'description' => $this->description,
'image' => $this->image_url,
'dates' => AnimalDateResource::collection($this->animalDates)
];
}
}
在控制器中,我只使用 new AnimalResource($animal)
并且方法索引和显示效果完美。
是否有任何解决方案 POST 它像 Animal 然后是 AnimalDate,还是我必须先 POST 它然后通过 JsonResouce 显示关系?
如果是一对一,您可以直接访问与资源的关系。但是我不知道如果是多对一你是否可以访问关系。这东西对我有用。
public function toArray($request)
{
$newAnimalDates = array();
foreach($AnimalDates as $animalDates) {
$newAnimalDates[] = [
"id": $animalDates->id,
"date_from": $animalDates->date_from,
"date_to": $animalDates->date_to,
"animal_id": $animalDates->animal_id,
]
}
return [
'id' => $this->id,
'name' => $this->name,
'country' => $this->country,
'description' => $this->description,
'image' => $this->image_url,
'dates' => $newAnimalDates
];
}
好的,问题出在 AnimalController@store。
解决前:
public function store(Request $request)
{
$data = $request->all();
$animal = Animal::create($data);
return response()->json($animal, 201);
}
问题修复后:
public function store(Request $request)
{
$data = $request->all();
$animal = Animal::create($data);
// THIS LINE
return new AnimalResource($animal);
}