如何使获取的结果适合模型?

How to make a fetched result fit into a model?

假设我做了一个

$response = Http::get('http://example.com');
$i_want_to_be_a_model = $response->json();

我有一个 \App\Models\Example 模型。

如何让 $i_want_to_be_a_model 成为 Example 模型?

我想这样做,因为我想向模型添加一个方法 statusText(),这不是结果的一部分。

class Example extends Model {
   
  // ..
  public string $statusText;
  public int $status;


  public function statusText() {
    switch ($this->status) {
      case 100:
        $this->statusText = "foo";
        break;
      //..
      default:
        $this->statusText = "bar";
    }
  }
}

如果有更优雅的方法,请告诉我。

您可以定义一个 helper 函数或一个 Factory class 来创建 Example class 的对象。

例如:

<?php

namespace App\Factories;

use App\Models\Example;
use Illuminate\Support\Facades\Schema;

class ExampleFactory
{

    public function __construct(array $attributes)
    {
        $example = new Example;

        $fields = Schema::getColumnListing($example->getTable());

        foreach($attributes as $field => $value) {
            if(in_array($field, $fields) {
                $example->{$field} = $value;
            }
        }

        return $example;
    }

    public static function makeFromArray(array $attributes)
    {
        return new static(... $attributes);
    }
}

然后你可以使用工厂作为

// use App\Factories\ExampleFactory;

$response = Http::get('http://example.com');

$example = ExampleFactory::makeFromArray(json_decode($response->json(), true));

//Now you can do whatever you want with the instance, even persist in database
$example->save();