【问题标题】:Storing data with Eloquent Model not working, Call to undefined method使用 Eloquent 模型存储数据不起作用,调用未定义的方法
【发布时间】:2019-08-07 08:43:16
【问题描述】:

我想用 Laravel 制作 Restful API,我想编写一个通过 CSV 文件的脚本,首先 POST Animal,然后从响应中获取 Animal ID,然后 POST AnimalDate,但是它没有按我的意愿工作并且我收到以下错误:

调用未定义的方法 App\Animal::getAnimalDateAttribute()

我有像 Animal 和 AnimalDate 这样的模型,我想在 json 中显示响应,所以我将 Eloquent Resources 与 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 属于动物

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) 和方法索引,并且显示效果很好。

有什么解决方案可以像 Animal 然后 AnimalDate 那样发布它,还是我必须先发布它然后通过 JsonResouce 显示关系?

【问题讨论】:

  • 您访问代码中某处的错误->animalDate withouth复数,但这里没有代码显示,您可以在您的项目中进行查找吗?
  • 不确定是否相关,但您同时拥有 animalDate 和 animalDates(复数形式)
  • 您需要创建一个可以保存数组的变量,例如newAnimalDates 创建一个 foreach 循环并将每个 AnimalDates 推送到您的 newAnimalDates 数组。然后你可以拨打'dates' => newAnimalDates
  • 用截图分享完整错误并分享Animal的完整模型类

标签: php laravel eloquent laravel-resource


【解决方案1】:

如果是一对一,您可以直接访问与您的资源的关系。但我不知道如果它是多对一,您是否可以访问该关系。这东西对我有用。

    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
        ];
    }

【讨论】:

  • 我不相信这是他面临的问题
  • 是他的控制器或资源或模型有问题吗?
  • 这不是我的问题的解决方案,我想先发布 Animal 然后再发布 AnimalDate。
  • 你的表单中是否有相同的AnimalAnimalDates字段?
【解决方案2】:

好的,问题出在 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2015-12-20
    • 2019-09-29
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多