如何使获取的结果适合模型?
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();
假设我做了一个
$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();