Laravel 8 all() 函数不会将 db 值映射到模型属性

Posted

技术标签:

【中文标题】Laravel 8 all() 函数不会将 db 值映射到模型属性【英文标题】:Laravel 8 all() Function does not map db values to model properties 【发布时间】:2022-01-15 17:18:33 【问题描述】:

我对 laravel 相当陌生,所以我认为这是一个新手问题。基本上我尝试通过静态 all() 函数检索我的数据库数据。但不知何故,我生成的模型实例仅在属性数组中填充数据,但所有模型属性均为空。

我有一条简单的路线

Route::get('/posts', function () 
    $posts = App\Models\Post::all();
    ddd($posts[0]);
    return view('posts', [
        'posts' => $posts,
    ]);
);

还有一个简单的模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model

    use HasFactory;

    public $id;
    public $title;
    public $excerpt;
    public $body;
    public $published_at;
    public $category_id;

    protected $fillable = [
        'title',
        'excerpt',
        'body',
        'published_at',
        'category_id',
    ];

    protected $guarded = ['id'];

    public function category() 
        return $this->belongsTo(Category::class);
    

这是 ddd() 返回的内容

App\Models\Post #1225 ▼
  +id: null
  +title: null
  +excerpt: null
  +body: null
  +published_at: null
  +category_id: null
  #fillable: array:5 [▶]
  #guarded: array:1 [▶]
  #connection: "mysql"
  #table: "posts"
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  +preventsLazyLoading: false
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #escapeWhenCastingToString: false
  #attributes: array:8 [▼
    "id" => 1
    "title" => "Dedrick Ebert DDS"
    "excerpt" => "Possimus sit animi enim error. Omnis maxime ducimus nesciunt omnis quibusdam."
    "body" => "Neque est aliquid est placeat. Eaque nihil nobis nobis nostrum consequuntur. Omnis quis aut ipsum quo. Facilis velit ducimus quisquam consequatur vitae quidem.  ▶"
    "published_at" => "2003-10-06"
    "category_id" => 7
    "created_at" => "2021-12-07 20:30:15"
    "updated_at" => "2021-12-07 20:30:15"
  ]
  #original: array:8 [▶]
  #changes: []
  #casts: []
  #classCastCache: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []

有人可以解释一下我在这里缺少什么吗?

感谢您的指点

【问题讨论】:

边信息:Laravel 定义了一个神奇的 __get__set 函数,将 $post-&gt;id 转换为 $post-&gt;getAttribute('id') 进而从属性数组中获取 id 属性(粗略地说)。 非常有用的补充 - 谢谢! 【参考方案1】:

你想得到什么结果?

$posts 的第一个元素是第一篇文章的对象,您不需要再次定义这些属性。你可以使用

$post->id

删除所有定义的属性。

【讨论】:

以上是关于Laravel 8 all() 函数不会将 db 值映射到模型属性的主要内容,如果未能解决你的问题,请参考以下文章

Laravel DB::update 只返回 0 或 1

如何使用 Laravel IoC 将数据库注入构造函数

Laravel UNION ALL 不适用于 where 语句

Laravel 8 迁移:DB:unprepared 不适用于共享托管服务器

如何将 Laravel 资源 API 数据传递给 Vuejs?

如何在 laravel 5.5 迁移中将 DB::unprepared() 用于 mysql 函数和存储过程