现在我已经花了一些时间来了解 Laravel、Eloquent 和 PHP,我将分享一些内容,希望对其他初学者有所帮助。
PHP 是一种动态语言,其代码是动态编译的(这与 C# 和 VB.NET 不同)。您的模型类不需要显式定义成员即可访问/可分配,因此只要它们扩展Model
(Laravel Eloquent 中的内置类),您可以为与基础数据库表列同名的不存在的成员赋值,Eloquent 会为您将其存储在数据库中。例如,如果您有一个posts
数据库中的表有一个名为body
,您可以编写以下代码在数据库中创建新记录:
$p = new Post;
$p->body = 'Some stuff';
$p->save();
当然你需要上课Post
在您的项目中延伸自Model
但你不需要定义一个成员body
在那个班级里面。对于来自 .NET 世界的人来说,这听起来很奇怪,但这就是动态语言的工作原理。
至于自动生成模型,Laravel 包含内置命令(php artisan make:model
)可以为您生成这些。
最后,对于智能感知和自动完成,请使用 Laravel 本身使用的相同工具,即 DocBlocks。这些是 PHP 中特殊类型的注释,您可以使用它们来记录代码元素。因此,您可以将 DocBlock 添加到包含属性名称和类型的所有模型类中。对每个人来说幸运的是,VS Code 中有一个非常简洁的扩展,可以自动为您执行此操作。使用以下命令安装它:
composer require --dev barryvdh/laravel-ide-helper
现在运行以下命令为所有模型类生成 DocBlocks(显然您应该在此之前已经生成数据库和模型):
php artisan ide-helper:models --dir='app'
该扩展将获取数据库的结构并将 DocBlocks 注入到所有模型中,如下所示:
/**
* App\User
*
* @property int $id
* @property string $name
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\User whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Exam whereUpdatedAt($value)
* @mixin \Eloquent
*/
class User extends Model
{
}
VS Code 现在将在模型属性中显示表字段名称,如下所示(了解智能感知如何调出name
当我们键入时,我们的 DocBlocks 中的成员na...
):
Note that I also have Intelephense installed in my VS Code, though I'm not sure if that is required for auto-complete feature to work.
Edit
动态属性在 PHP 8.2 中已被弃用,并且我听说它们将在 PHP 9.0 中变得无效,这意味着 Laravel 模型在未来的版本中不应该能够执行这种神奇的操作。
我不是 PHP 专家,但我听说我们不需要惊慌。两件事:首先,实现的对象__get
and __set
将继续正常工作。其次,加上你(他们)还可以使用#[AllowDynamicProperties]
在模型类上允许动态道具。最后,他们可以重写模型生成器以将列名称作为模型类中的 props 输出。最后一个将是最好的,将使 PHP 更接近 C# 世界的工作原理(正是这篇文章的开始,哈哈)。