Laravel5.7 Eloquent ORM快速入门详解
Laravel Eloquent ORM快速入门详解——长沙网络推广分享
今天长沙网络推广为大家带来一篇关于Laravel Eloquent ORM的快速入门详解。Eloquent ORM是Laravel框架内置的数据库交互模块,具有美观简洁的ActiveRecord实现方式。让我们跟随长沙网络推广的脚步,一起来了解它的奥秘吧!
一、简介
二、定义模型
让我们从创建一个Eloquent模型开始。模型类通常位于app目录下,也可以放在其他能够被poser.json文件自动加载的地方。所有Eloquent模型都继承自Illuminate\Database\Eloquent\Model类。
创建模型实例的最简单方式是使用Artisan命令make:model。例如:
```bash
php artisan make:model Flight
```
如果你想在生成模型时同时生成数据库迁移,可以使用--migration或-m选项。
三、Eloquent模型约定
现在,让我们来看一个Flight模型的例子。我们将使用该类来获取和存取数据表flights中的信息。
在模型定义中,我们遵循一些约定来确保代码的规范和清晰。例如,表名默认为模型类名的小写复数形式(如Flight模型对应的是flights表)。如果表名有特殊需求,可以在模型中通过$table属性进行指定。主键默认为id,可以在模型类中通过$primaryKey属性进行覆盖。Eloquent还提供了对时间戳的自动管理功能,可以通过$timestamps属性进行开启或关闭,以及自定义时间戳格式的设置。下面是一个简单的Flight模型示例:
```php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model {
// 指定自定义的表名(可选)
protected $table = 'my_flights';
// 指定非自增或非数字类型的主键(可选)
protected $primaryKey = 'custom_id';
// 关闭时间戳自动管理(可选)
public $timestamps = false;
// 自定义时间戳格式(可选)
const DATE_FORMAT = 'Y-m-d H:i:s';
}
```
通过以上的介绍,我们对Laravel Eloquent ORM的快速入门有了初步的了解。在实际开发中,我们还可以通过定义关联关系、使用查询构造器等方式来更灵活地与数据库进行交互。希望这篇文章对大家有所帮助,也欢迎大家提出宝贵的建议和反馈。长沙网络推广将继续为大家带来更多有关Laravel开发的知识和技巧,敬请期待!在数据库中存储日期和模型序列化时日期的格式处理
在PHP的Laravel框架中,使用Eloquent ORM进行数据库操作时,我们经常需要处理日期和时间相关的数据。对于如何存储日期到数据库中以及如何序列化为数组或JSON时的日期格式,我们可以通过定义模型中的属性来进行设置。
在Laravel的Eloquent模型中,我们定义了一个名为Flight的模型类。在这个类中,我们可以设置日期的存储格式以及自定义时间戳字段的名称。
我们来看日期的存储格式。在Flight模型中,我们定义了一个受保护的属性`$dateFormat`,它的值是 `'U'`。这意味着日期将以Unix时间戳的格式(从1970年1月1日开始的秒数)存储到数据库中。你也可以根据需要设置为其他格式,如 `'Y-m-d H:i:s'` 代表常见的日期时间格式。
接下来,如果你想要自定义用于存储时间戳的字段名称,比如将创建时间的字段名设置为`creation_date`,将更新时间字段名设置为`last_update`,你可以在模型中设置`CREATED_AT`和`UPDATED_AT`常量。这样,当执行创建和更新操作时,Laravel会自动使用这些自定义的字段名。
所有的Eloquent模型默认使用应用配置中的默认数据库连接。如果你想要为模型指定不同的数据库连接,可以通过定义`$connection`属性来设置。例如,你可以将Flight模型使用的数据库连接设置为`'connection-name'`。
创建完模型及其关联的数据表后,我们可以从数据库中获取数据。Eloquent模型是一个强大的查询构建器,允许你流畅地查询与其关联的数据表。你可以使用`all()`方法来获取所有记录,或者使用`where()`方法来添加约束条件。由于Eloquent模型本质上是查询构建器,你还可以使用查询构建器的所有方法来执行复杂的查询操作。
获取的结果集是一个`Collection`实例,它提供了许多有用的函数来处理结果集。你可以像数组一样遍历该集合,或者使用`reject()`方法来过滤掉满足特定条件的记录。
如果你需要处理大量的数据,可以使用`chunk()`方法来分批处理结果集。这个方法允许你指定一次处理的记录数量,有效减少内存消耗。
通过合理设置模型和查询参数,我们可以灵活地处理日期和时间数据,从数据库中获取我们需要的数据,并进行有效的批量处理。游标与数据库操作的艺术
数据库游标作为一种强大的工具,允许开发者逐条处理数据库记录,而不是一次性加载所有内容。在Laravel框架中,cursor方法的使用对于处理大量数据尤为出色,因为它能显著减少内存消耗。想象一下,当你需要遍历一个庞大的航班数据表时,使用cursor方法可以让你的应用更加高效运行。
除了使用cursor进行批量处理,你还可以使用find和first方法来获取单个模型或聚合结果。这些功能使你能够精确地获取所需的数据,而不是整个数据表的内容。通过传递主键数组调用find方法,你还可以获取多个匹配的记录。这种灵活性在处理复杂查询时非常有价值。
有时候我们可能会遇到找不到模型的情况。这时,我们可以使用findOrFail和firstOrFail方法。如果模型不存在,这些方法将抛出异常,并返回HTTP 404响应。这在路由或控制器中特别有用,因为它们允许你在不返回错误响应的情况下处理异常情况。
Laravel的查询构建器还提供了聚合方法,如count、sum、max等。这些方法允许你执行更复杂的查询并获取计算结果,而不是整个模型实例。这对于统计和分析数据非常有用。
当我们需要更新一个已存在的模型时,我们可以使用 `save` 方法。这个方法首先会找到对应的模型实例,然后允许我们修改其属性,最后将这些更改保存到数据库中。这个过程非常简单,就像下面的例子一样:
```php
$flight = App\Flight::find(1); // 找到ID为1的航班模型实例
$flight->name = 'New Flight Name'; // 修改航班名称属性
$flight->save(); // 保存更改到数据库,同时自动更新 updated_at 时间戳
```
我们还可以进行批量更新操作。这意味着我们可以根据给定的查询条件一次性更新多个模型实例。例如,我们可以将所有标记为活跃的、目的地为 San Diego 的航班标记为延迟状态:
```php
App\Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]); // 使用数组传递更新的键值对参数到 update 方法
```
在进行批量更新时,值得注意的是 Eloquent 不会触发 `saved` 和 `updated` 模型事件,因为在这种情况下,并没有从数据库重新获取模型实例。这有助于我们理解事件触发的上下文和时机。另外需要注意的是,批量赋值虽然方便,但也带来了一定的安全风险。为了解决这个问题,我们需要定义哪些属性是可以被赋值的。这可以通过 `$fillable` 属性来实现。例如:
```php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model {
protected $fillable = ['name']; // 定义可以被批量赋值的属性列表
}
```设置完 `$fillable` 属性后,我们就可以安全地使用 `create` 方法创建新的模型实例了。例如:`$flight = App\Flight::create(['name' => 'Flight 10']);` 同样地,对于已经存在的模型实例,我们可以使用 `fill` 方法来填充属性并保存更改。例如: `$flight->fill(['name' => 'Flight 22']);`我们还可以使用 `$guarded` 属性来指定我们不希望被赋值的属性列表。这是一个类似于“黑名单”的机制,但它与 `$fillable` 属性是互斥的,不能同时使用。这样设计的目的在于帮助我们更好地控制数据的输入和输出,确保数据的安全性和完整性。Eloquent ORM 提供了强大的工具来管理数据库模型更新和赋值操作,同时确保数据的安全性和一致性。这使得我们能够以更加灵活和高效的方式与数据库进行交互。狼蚁网站上的飞行模型,它的SEO优化细节中,除了价格(price)属性外,其他所有属性都是可以批量赋值的。让我们深入这个模型的细节。
在PHP的Laravel框架中,我们定义了一个名为Flight的模型类,它继承了Eloquent的Model类。在这个类中,我们定义了一个特殊的属性$guarded,它是一个数组,用来指定哪些属性是不允许批量赋值的。在这个例子中,除了价格(price)外,其他所有属性都可以被批量赋值。这种设计是为了保护某些关键属性不被意外修改。
如果你希望所有的属性都可以被批量赋值,你可以将$guarded属性设置为一个空数组。这意味着你可以一次性为模型的所有属性赋予新的值。这在批量处理数据或者数据迁移时特别有用。
除了基本的批量赋值操作,Laravel还提供了其他一些有用的方法来创建模型实例。例如,firstOrCreate和firstOrNew方法。这两个方法都会首先尝试在数据库中查找匹配的记录。如果找不到匹配的记录,它们会采取不同的操作。
firstOrCreate方法会创建一个新的模型实例并赋予给定的属性。这个方法会在数据库中创建一个新的记录。与之类似,firstOrNew方法会返回一个尚未持久化的模型实例。这意味着你需要手动调用save方法将这个实例保存到数据库中。这些方法特别适用于当你需要根据给定的属性快速获取或创建模型实例的场景。
还有一个updateOrCreate方法,它可以在模型实例已存在的情况下进行更新操作,如果不存在则创建新的模型实例。这个方法大大简化了在需要更新或创建模型实例时的操作,提高了开发效率。这些创建方法提供了灵活的方式来处理模型的创建和更新操作,使得开发者能够更高效地管理数据库中的数据。关于模型更新、删除与软删除
在Laravel框架中,Eloquent ORM提供了一种便捷的方式来管理数据库模型。下面将介绍模型的更新、删除和软删除功能。
更新模型
`updateOrCreate`方法是Eloquent提供的一个强大工具,它允许你根据给定的条件更新模型或创建新模型。这个方法会持久化模型,因此无需再调用`save()`方法。例如,你可以这样操作从奥克兰飞往圣地亚哥的航班价格:
```php
$flight = App\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99]
);
```
上述代码会检查是否存在出发地为奥克兰、目的地为圣地亚哥的航班记录,如果存在则更新其价格,否则创建新的航班记录。
删除模型
删除模型可以通过调用模型实例上的`delete`方法来实现。例如:
```php
$flight = App\Flight::find(1);
$flight->delete();
```
在上面的代码中,我们首先通过主键找到模型实例,然后调用`delete`方法将其从数据库中删除。
如果你知道模型的主键,还可以直接使用`destroy`方法来删除模型,无需先获取模型实例:
```php
App\Flight::destroy(1);
App\Flight::destroy([1, 2, 3]); // 删除多个模型
```
还可以通过查询来删除多个模型。例如,下面的代码删除了所有被标记为无效的航班:
```php
$deletedRows = App\Flight::where('active', 0)->delete();
``` 需要注意的是,在进行批量删除时,模型的`deleting`和`deleted`事件不会被触发。这是因为删除操作不会获取模型实例。
软删除
除了直接从数据库中物理删除记录外,Laravel还提供了软删除功能。软删除不会真正从数据库中移除记录,而是将模型的`deleted_at`属性设置为当前日期和时间。要启用模型的软删除功能,需要在模型中使用`SoftDeletes` trait并将`deleted_at`列添加到 `$dates` 属性中。你还需要在数据表中添加 `deleted_at` 列。例如:
```php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Flight extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
} 接下来可以使用 Schema 构建器添加 deleted_at 列到数据表中:
Schema::table('flights', function ($table) { $table->softDeletes(); }); 现在当调用模型的 delete 方法时将会执行软删除操作。软删除允许你在未来的操作中恢复已删除的模型或者在查询时过滤掉已删除的模型。这使得数据库操作更加灵活和方便管理。 ``` 通过软删除功能,我们可以更灵活地管理数据库中的记录,同时保留必要的历史数据。这在很多情况下是非常有用的功能。关于模型实例的软删除处理与查询作用域
当我们谈论软删除时,我们指的是一种删除记录的方法,但实际上并没有从数据库中永久删除该记录。这在某些场景下非常有用,比如你想隐藏某些数据但不完全删除它。使用 Laravel 的 Eloquent ORM,我们可以很容易地处理软删除。
判断模型实例是否被软删除
我们可以使用 `trashed` 方法来判断一个模型实例是否被软删除。例如:
```php
if ($flight->trashed()) {
// 模型实例已被软删除
}
```
查询被软删除的模型
默认情况下,当我们查询数据库表时,软删除的记录会被自动排除。但如果你想在查询中包含软删除的记录,可以使用 `withTrashed` 方法。例如:
```php
$flights = App\Flight::withTrashed()
->where('account_id', 1)
->get();
```
`withTrashed` 方法也可以用于关联查询中。
只获取软删除模型
使用 `onlyTrashed` 方法可以只获取软删除的模型。例如:
```php
$flights = App\Flight::onlyTrashed()
->where('airline_id', 1)
->get();
```
恢复软删除模型
要恢复一个被软删除的模型,可以使用 `restore` 方法。例如:
```php
$flight->restore();
```
同样,你可以在查询中使用 `restore` 方法来快速恢复多个模型。这个方法不会触发任何模型事件。
永久删除模型
如果你确实想从数据库中永久删除一个模型,可以使用 `forceDelete` 方法。例如:
```php
$flight->forceDelete();
```
查询作用域
除了上述的软删除功能,Laravel 还提供了查询作用域的功能,允许我们为给定模型的所有查询添加条件约束。全局作用域是一个特别有用的功能,它允许我们为模型的所有查询默认添加特定条件。例如,我们可以创建一个全局作用域来默认排除软删除的记录或只包括特定条件下的记录。
要编写自定义全局作用域,可以创建一个实现 `Illuminate\Database\Eloquent\Scope` 接口的类。在这个类的 `apply` 方法中,我们可以添加需要的条件到查询中。例如,我们可以创建一个名为 `AgeScope` 的全局作用域,默认排除年龄大于 200 的记录。这样,每次查询 `App\Flight` 模型时,都会自动应用这个条件。如果你希望在某些情况下排除这个作用域的影响,可以在查询中使用 `globalScope` 方法来暂时禁用它。软删除和查询作用域是 Laravel 中非常有用的功能,它们大大简化了数据库操作并提供了更多的灵活性。在编程世界中,全局作用域和本地作用域扮演着至关重要的角色。为了更好地理解并应用它们,让我们深入一下如何在 Eloquent ORM 中使用全局作用域和本地作用域。
```php
namespace App;
use App\Scopes\AgeScope;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
protected static function boot() {
parent::boot();
static::addGlobalScope(new AgeScope()); // 添加全局作用域到模型上
}
}
```
作用域在查询构建器实例中的应用
在PHP的Laravel框架中,Eloquent ORM提供了一种强大的方式来管理数据库操作。其中,作用域是一个强大的功能,它允许我们在查询模型时定义特定的查询条件。本文将详细介绍如何使用作用域以及其在查询构建器实例中的应用。
在App命名空间中,我们定义了一个User类,它继承了Model类。在这个类中,我们定义了两个作用域方法:Popular和Active。这两个方法分别用于过滤活跃用户和具有特定投票数的用户。这些作用域在本质上是一个实例方法,返回一个模型的查询构建器实例。这意味着我们可以在查询模型时调用这些方法,并链式地添加多个作用域。例如,我们可以使用App\User::popular()->active()->orderBy('created_at')->get()来获取活跃且投票数超过100的用户列表。
除了静态作用域,我们还可以定义动态作用域。动态作用域允许我们在作用域方法中接收额外的参数。在User类中,我们定义了一个名为"OfType"的作用域方法,它接受一个参数来确定查询用户的类型。我们可以像这样使用它:$users = App\User::ofType('admin')->get()来获取所有类型为admin的用户。
除了作用域,Eloquent模型还提供了其他有用的功能。例如,"比较模型"功能允许我们快速验证两个模型是否具有相同的主键、数据表以及数据库连接。我们可以使用is方法来执行此操作。Eloquent模型还可以触发事件。这些事件允许我们在模型生命周期的多个时间点执行代码。例如,当从数据库中检索模型时,会触发retrieved事件。当保存新模型时,会触发creating和created事件。当更新已存在的模型时,会触发updating和updated事件。无论模型是创建还是更新,saving和saved事件都会被触发。但需要注意的是,在进行批量更新时,这些事件不会在更新的模型上触发,因为它们在进行批量更新时没有真正检索过。
Eloquent 模型中的事件分发机制:定义 `$dispatchesEvents` 属性映射模型生命周期事件
在 Laravel 的 Eloquent 模型中,我们可以使用 `$dispatchesEvents` 属性来映射模型生命周期中的多个时间点与对应的事件类。这样,每当模型触发特定的事件(如保存、删除等),都可以自动派发相应的事件。
假设我们有一个 `User` 模型,可以像这样定义 `$dispatchesEvents` 属性:
```php
namespace App;
use App\Events\UserSaved;
use App\Events\UserDeleted;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/
事件映射表。
变量用于存储模型生命周期中的事件映射。
@var array
/
protected $dispatchesEvents = [
'saved' => UserSaved::class, // 当用户被保存时触发 UserSaved 事件
'deleted' => UserDeleted::class, // 当用户被删除时触发 UserDeleted 事件
];
}
```
为了更好地组织代码和事件处理逻辑,我们可以使用观察者模式来创建观察者类。在 Laravel 中,可以使用 Artisan 命令轻松创建观察者类。例如,要创建一个名为 `UserObserver` 的观察者类来监听 `User` 模型的事件,可以运行以下命令:
```bash
php artisan make:observer UserObserver --model=User
```
该命令将在 `App/Observers` 目录下生成新的观察者类。你可以在此类中定义各种方法来处理不同的事件。例如:
```php
namespace App\Observers;
use App\User;
class UserObserver {
/
处理用户创建事件。接收模型作为参数。当有新的用户被创建时触发。 你可以在这里执行你想要的操作,比如发送通知等。 你可以在这里添加更多的方法来处理其他事件。 示例方法包括:updated 和 deleted 等。 这些方法接收一个 User 对象作为参数,并处理相应的事件逻辑。例如:当用户被更新时,你可以更新他们的信息或发送通知等。当用户被删除时,你可以执行清理操作或发送通知等。这些方法在事件发生时被调用并执行相应的操作。你可以在适当的方法中添加自己的逻辑来处理不同的事件场景。通过这种方式,你可以轻松地在 Eloquent 模型中管理事件并对其进行响应处理。注册观察者非常简单,只需使用模型的 observe 方法即可。你可以在服务提供者(如 AppServiceProvider)的 boot 方法中注册观察者类。这样,每当发生相应的事件时,观察者就会自动处理它们并执行相应的操作。Eloquent 模型中的事件分发机制是一种强大的工具,它允许你在模型生命周期的不同阶段执行自定义操作。通过使用 `$dispatchesEvents` 属性和观察者模式,你可以轻松地将事件与代码逻辑相关联并实现高效的响应处理。这有助于提高应用程序的可维护性和可扩展性,同时确保代码的整洁和清晰。以上就是本文的全部内容,希望对您有所启发和帮助。更多信息请继续关注我们的博客和学习资源分享平台狼蚁SEO。让我们共同和学习更多关于 Laravel 和 Eloquent 模型的知识!
编程语言
- Laravel5.7 Eloquent ORM快速入门详解
- Vue发布项目实例讲解
- Nuxt配合Node在实际生产中的应用详解
- 基于mpvue的小程序markdown适配解决方案
- JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
- Angular6 写一个简单的Select组件示例
- jQuery扩展方法实现Form表单与Json互相转换的实例代
- Security安装 Elastic SIEM 和 EDR的超详细教程
- 深度解析MySQL 5.7之临时表空间
- layui实现数据表格点击搜索功能
- 当年学习ADO.NET的笔记
- jQuery实现鼠标滑过商品小图片上显示对应大图片
- jquery实现点击弹出带标题栏的弹出层(从右上角飞
- Bootstrap每天必学之按钮
- php常用表单验证类用法实例
- js实现图片放大和拖拽特效代码分享