【问题标题】:How to create model, that get data from JSON?如何创建从 JSON 获取数据的模型?
【发布时间】:2021-07-29 15:48:53
【问题描述】:

我在控制器中有 Http:get:

class PostController extends Controller {

private $data;

public function __construct()
{
    $minutes = 5;
    $this->data = Cache::remember('posts', $minutes, function () {
        return Http::get('https://jsonplaceholder.typicode.com/posts?_limit=20')->json();
    });
}

public function index() {
    $posts = $this->data; // i want this line like that: $posts = Post::all()
    return view('posts', compact('posts'));
}
}

如何取出数据并用这个 Http 数据创建一个单独的模型?

【问题讨论】:

标签: php laravel model-view-controller laravel-8


【解决方案1】:

您应该根据您从表单 url 获取的数据中存在的属性创建一个类。 因此,您可以通过将数据传递给它来创建一个实例:

$post = new Post();
$post->title = $post_fetched_from_url->title;

return $post;

输出如下:

App\Models\Post {#3365
 title: "This is a title",
 ...
}

所以这是一个模型实例,它是您在运行中制作的,它没有存储在您的数据库中。

虽然如果您有多个帖子,您可以循环播放帖子。

更新: 所以你的答案是这样的:

$posts = Http::get('https://jsonplaceholder.typicode.com/posts?_limit=20')->json();

$posts = collect($posts)->map(function($item) {
    $model = new Post();
    $model->user_id = $item['userId'];
    $model->id = $item['id'];
    $model->title = $item['title'];
    $model->body = $item['body'];
    return $model;
});

return dd($posts);

这是输出

【讨论】:

  • 我应该这样做 $Post = new Post($this->data);在控制器中?
  • 是的,但是您也可以在模型中执行此操作,但最简单的方法是将其写入您的控制器中。我刚刚更新了我的答案以澄清我的意思。
  • 您能具体解释一下吗?如何获取多条记录?
  • 程序抛出此错误:'不能使用 GuzzleHttp\Psr7\Response 类型的对象作为数组'
  • 确保$posts 返回一个数组。如果不是,则将其转换为数组。
猜你喜欢
  • 2016-04-22
  • 2023-03-08
  • 2021-05-02
  • 2020-09-22
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多