
是一个开源、易用的 。它最强大的功能之一是 Eloquent,这是一种对象关系映射器(ORM),可简化数据库记录处理。
Eloquent 可加快应用程序对数据库进行创建、读取、更新和删除操作的速度。使用 Eloquent 时,您可以创建映射数据库表的模型,并使用这些模型创建查询。
本文探讨了 Eloquent 最强大功能的六个要素:查询作用域、关系、突变器和访问器、 *** 、模型删除和工厂。文章通过实际示例介绍了每个功能的作用。希望你能通过这些示例快速掌握 。
在构建应用程序时,有时会遇到多次使用条件的情况。每次重写代码都会增加出错的几率,并使代码变得不整齐。Laravel 解决了这个问题,它将这些条件封装在称为作用域的可重用语句中。
查询作用域是将数据库逻辑添加到模型中并重复使用查询逻辑的 *** 。
下面是一个查询作用域的示例。假设您想为团队创建一个软件开发平台,跟踪已完成和正在进行的功能。您可以使用此条件只检索正在进行的功能:
$onGoing = Project::where('ongoing', 1)->get();
您可能需要在其他应用程序页面(如统计页面)中使用此条件。查询作用域允许页面重复使用上述条件,从而简化查询并使代码更简洁。
下面介绍如何在这种情况下使用查询作用域:
class Features extends Model
{
public function scopeOngoing($query)
{
return $query->where('ongoing', 0);
}
}
然后使用下面的代码执行该作用域:
$onGoing = Feature::ongoing()->get();
有两种作用域:全局作用域和局部作用域。
全局作用域允许在模型内的所有查询中添加限制条件。例如,您可以在模型内的所有查询中添加一个条件,根据组长的姓名过滤特征。
本地作用域允许定义通用约束,以实现可重用性。例如,您可能希望应用程序返回存在错误的功能。您的代码可能会这样实现一个局部作用域:
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class User extends Model
{
public function scopeBugged($query)
{
return $query->where('bugged', '>', 1);
}
}
上面的代码会返回所有存在未修复错误的功能。
Eloquent 中的关系允许您轻松地将不同的表联系起来。例如,电子商务网站上的产品可能列出了库存、价格、视图和评论。有了 Eloquent,即使记录在不同的表中,您也可以轻松管理这些关系。
您可以将关系定义为模型类上的 *** ,就像定义 Eloquent 模型一样。一些常用的 Eloquent 关系包括一对一关系、逆关系和多态关系。
下面是一个将产品模型与库存关联起来的基本一对一关系示例。
public function Inventory()
{
return $this->hasOne('AppInventory');
}
在上面的代码中, Inventory() *** 调用了产品模型上的 hasOne() *** 。这将检查产品当前是否可用。
Eloquent 还允许您创建反向关系。例如,当您想根据查看次数来获取产品时。反向关系可以为您提供网站访客最感兴趣的产品。您可以使用 belongsto() *** ,它是 hasOne() 的逆向 *** 。下面的代码说明了这一点。
public function product()
{
return $this->belongsTo('AppProduct');
}
在上面的代码中,Eloquent 会将 product_id 与所传递的视图数量相匹配。然后,product_id 可以帮助获取其他参数,如价格和库存。
在应用程序开发中,关系并不总是那么简单。有时,一个模型属于多个模型类型。例如,产品和库存模型都可以与图像模型建立多态关系。
允许您在库存和产品中使用相同的图像列表。下面是实现多态关系的代码片段。
class Image extends Model
{
/**
* Getting the shared image.
*/
public function myimage()
{
return $this->morphTo();
}
}
class Product extends Model
{
/**
* Get the image to use on the product's page.
*/
public function image()
{
return $this->morphOne(Image::class, 'myimage');
}
}
class Inventory extends Model
{
/**
* Get the image to use on the inventory page.
*/
public function image()
{
return $this->morphOne(Image::class, 'myimage');
}
}
上面的代码使用 morphTo() *** 来检索多态模型的父模型。
这只是这个主题的冰山一角。更多详情,请参阅我们的 高级指南。
突变器和访问器允许你在存储和检索数据时修改数据。突变器在保存数据前修改数据,而访问器在检索数据时修改数据。
如果想在数据库中以小写存储姓名,可以创建一个突变器来执行这种转换。如果想在应用程序页面上将用户的名和姓显示为一个名字,可以创建一个访问器来实现这一目的。
下面是一个突变器的示例,该突变器可在保存名称之前将其大写。
class User extends Model
{
/**
* Mutators capitalizing first and last name.
*/
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = ucfirst($value);
}
public function setlastNameAttribute($value)
{
$this->attributes['last_name'] = ucfirst($value);
}
}
下面是一个访问器的示例,该访问器结合了用户的名和姓。
class User extends Model
{
/**
* accessor combining both names.
*/
public function getFullNameAttribute()
{
return ucfirst($this->first_name) . ' ' . ucfirst($this->last_name);
}
}
Eloquent *** 用于处理返回多个模型结果的 *** 。该类可在 IlluminateDatabaseEloquentCollection 中找到。
与数组一样,可以对 *** 进行迭代。下面是一个简单的迭代过程。
use AppModelsProduct;
$products = Product::where('availability', 1)->get();
foreach ($products as $product) {
echo $product->name;
}
*** 比数组更强大,因为您可以对它们执行更复杂的操作。例如,您可以显示所有可用产品的列表,并跳过所有未 “激活” 的产品。
$names = Product::all()->reject(function ($product) {
return $product->active === false;
})->map(function ($product) {
return $product->name;
});
以下是 *** 类提供的一些 *** 。
contains() *** 会检查代码是否包含指定模式,如下代码所示:
$products->contains(1); $products->contains(Product::find(1));
all() *** 会返回 *** 中包含的模型,如下所示:
$collection = Product::all();
还支持许多其他 *** 。
在 Eloquent 中,您可以创建模型来帮助构建查询。不过,有时您需要删除模型,以使应用程序更有效率。为此,请在模型实例上调用 delete。
use AppModelsStock; $stock = Stock::find(1); $stock->delete();
上面的代码会从应用程序中删除模型 Stock。这是永久删除,无法撤销。
Eloquent 的另一项功能是模型软删除功能。软删除模型时,不会将其从数据库中删除。
您可以使用 deleted_at 标记它,以指示软删除的时间和日期。当您想排除数据库中的部分记录(如不完整的记录),而又不想永久删除它们时,这一点非常重要。它有助于在不添加额外条件的情况下清理 Eloquent 的查询结果。
您可以通过在模型中添加 softDeletes 特性,并在相关数据库表中添加 deleted_at 列来启用软删除功能。
如下所示,通过添加 IlluminateDatabaseEloquentSoftDeletes 特性来启用模型软删除功能。
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;
class Flight extends Model
{
use SoftDeletes;
}
在开始使用软删除之前,你的数据库应该有一个 delete_at 列。添加这一列需要使用 Laravel Schema 生成器的辅助 *** ,如下所示:
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
Schema::table('users', function (Blueprint $table) {
$table->softDeletes();
});
Schema::table('users', function (Blueprint $table) {
$table->dropSoftDeletes();
});
这将添加一个 delete_at 列,在软删除操作成功的情况下,该列将用日期和时间更新。
如果希望查询结果包括软删除的模型,可以在查询中添加 withTrashed() *** 。下面是一个示例:
$stocks = Stock::withTrashed()->where('stock_id', 20)->get();
上述查询还将包括带有 deleted_at 属性的模型。
Eloquent 还允许您只检索软删除的模型。例如,您可以通过调用 onlyTrashed() *** 来做到这一点:
$Stock = Stock::onlyTrashed()->where('stock_id', 1)->get();
您也可以通过调用 restore() *** 来恢复软删除的模型。
$stocks = Stock::withTrashed()->where('stock_id', 20)->restore();
这会将软删除模型的 delete_at 字段改为空。如果模型未被软删除,则该字段保持不变。
Laravel 中的模型工厂可以创建虚拟数据,用于测试应用程序或为数据库提供种子数据。为此,你需要在工厂类中创建一个模型,如下图所示。代码片段创建了一个模型工厂,它可以生成产品及其价格的虚假供应商。
namespace DatabaseFactories;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;
class StockFactory extends Factory
{
public function definition()
{
return [
'supplier_name' => fake()->name(),
'price' => fake()->numberBetween($min = 1500, $max = 6000),
];
}
}
上例中的 definition() *** 会返回一组属性值,供 Laravel 在构建模型时使用。伪助手帮助工厂访问 PHP 库 。
Eloquent 简化了在 Laravel 中开发应用程序的任务。借助关系等实现方式,它在构建简单或复杂查询时同样有效。使用工厂生成功能性虚拟数据的简便性,使其成为希望为应用程序创建强大测试的开发人员的完美选择。此外,Eloquent 的作用域还有助于简化复杂的查询,使代码更加整洁。
本文仅介绍了 Eloquent 的六项主要功能,但 Eloquent 还有其他强大的功能。可共享和可重用模型的使用使 Eloquent 成为开发人员最喜爱的功能,而 Eloquent 查询的简洁性则使 Laravel 成为对开发人员友好的框架–即使对初学者来说也是如此。
不久前,PHP 8.0大张旗鼓地发布了。它带来了许多新特性、性能增强和变化——其中最令人兴奋的是新的JIT编译器。 技术世界总是在向前发展,PHP也是如此。 ,包含了几个令人兴奋的特性。它定于今年晚些时候于2021年11月25日发布。 在本文中,我们将详细介绍PHP 8.1将带来哪些新的东...
谁在尝试访问某些网站时没有遇到过更新Java的请求? 虽然许多人通过交互式网站功能熟悉Java,但用户可能不太熟悉JavaScript——或者,实际上,他们可能错误地认为两者是相同的。 在本文中,我们将讨论JavaScript 是什么以及Java和JavaScript之间的区别。然后我们将概...
Linux面板环境安装,主要支持LNMP和LAMP、Tomcat、node.js。不过对于大部分站长来说,主要是LNMP和LAMP两个环境的安装。 LNMP和LAMP两个环境的最大区别是,前者采用Nginx作为Web服务器,后者则采用Apache作为Web服务器。(选择哪个作为您的Web服务器,可...
本章节主要是对宝塔面板的主界面的各个版本进行一个简单的说明。 宝塔面板主界面主要包括:服务器操作系统、服务器状态、站点信息、软件管理及网络流量几个部分。 Windows面板有部分功能未实现,其余部分与Linux面板同步。 系统操作...
您是否正在寻找成功的方法来加快Laravel的性能,同时在您的项目上工作?你来对地方了! Laravel是一个流行的开源PHP框架,以其强大的安全性和简单而复杂的编码架构而闻名。它是构建能够推动收入和推动业务发展的尖端Web应用程序的绝佳选择。 尽管如此,如果你不使用正确的优化技术,Lara...
是一个免费的开源Web开发框架。它旨在通过为模板设计提供一组语法来简化响应式、移动优先网站的Web开发过程。 换句话说,Bootstrap帮助Web开发人员更快地构建网站,因为他们不需要担心基本的命令和功能。它由HTML、CSS和基于JS的脚本组成,用于各种与网页设计相关的功能和组件。 本文...