Laravel5.7 Eloquent ORM快速入门详解

简介

Laravel 内置的 Eloquent ORM 提供了一个美观、简单的与数据库打交道的 ActiveRecord 实现,每张数据表都对应一个与该表进行交互的模型(Model),通过模型类,你可以对数据表进行查询、插入、更新、删除等操作。

在开始之前,确保在 config/database.php 文件中配置好了数据库连接。更多关于数据库配置的信息,请查看文档。

定义模型

我们从创建一个 Eloquent 模型开始,模型类通常位于 app 目录下,你也可以将其放在其他可以被 composer.json 文件自动加载到的地方。所有 Eloquent 模型都继承自 Illuminate\Database\Eloquent\Model 类。

创建模型实例最简单的办法就是使用 Artisan 命令 make:model:

php artisan make:model Flight

如果你想要在生成模型时生成数据库迁移,可以使用 --migration 或 -m 选项:

php artisan make:model Flight --migration
php artisan make:model Flight -m

Eloquent 模型约定

现在,让我们来看一个 Flight 模型的例子,我们将用该类获取和存取数据表 flights 中的信息:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
 //
}

表名

注意我们并没有告诉 Eloquent 我们的 Flight 模型使用哪张表,默认规则是小写的模型类名复数格式作为与其对应的表名(除非在模型类中明确指定了其它名称)。所以,在本例中,Eloquent 认为 Flight 模型存储记录在 flights 表中。你也可以在模型中定义 table 属性来指定自定义的表名:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
 /**
  * 关联到模型的数据表
  *
  * @var string
  */
 protected $table = 'my_flights';
}

主键

Eloquent 默认每张表的主键名为 id,你可以在模型类中定义一个 $primaryKey 属性来覆盖该约定。

此外,Eloquent 默认主键字段是自增的整型数据,这意味着主键将会被自动转化为 int 类型,如果你想要使用非自增或非数字类型主键,必须在对应模型中设置 $incrementing 属性为 false,如果主键不是整型,还要设置 $keyType 属性值为 string。

时间戳

默认情况下,Eloquent 期望 created_at 和 updated_at 已经存在于数据表中,如果你不想要这些 Laravel 自动管理的数据列,在模型类中设置 $timestamps 属性为 false:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
 /**
  * 表明模型是否应该被打上时间戳
  *
  * @var bool
  */
 public $timestamps = false;
}

如果你需要自定义时间戳格式,设置模型中的 $dateFormat 属性。该属性决定日期被如何存储到数据库中,以及模型被序列化为数组或 JSON 时日期的格式:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
 /**
  * 模型日期列的存储格式
  *
  * @var string
  */
 protected $dateFormat = 'U';
}

如果你需要自定义用于存储时间戳的字段名称,可以在模型中设置 CREATED_AT 和 UPDATED_AT 常量:

<?php

class Flight extends Model
{
 const CREATED_AT = 'creation_date';
 const UPDATED_AT = 'last_update';
}

数据库连接

默认情况下,所有的 Eloquent 模型使用应用配置中的默认数据库连接,如果你想要为模型指定不同的连接,可以通过 $connection 属性来设置:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
 /**
  * The connection name for the model.
  *
  * @var string
  */
 protected $connection = 'connection-name';
}

获取模型

创建完模型及其关联的数据表后,就可以从数据库中获取数据了。将 Eloquent 模型看作功能强大的查询构建器,你可以使用它来流畅的查询与其关联的数据表。例如:

<?php

use App\Flight;

$flights = App\Flight::all();

foreach ($flights as $flight) {
 echo $flight->name;
}

添加额外约束

Eloquent 的 all 方法返回模型表的所有结果,由于每一个 Eloquent 模型都是一个查询构建器,你还可以添加约束条件到查询,然后使用 get 方法获取对应结果:

$flights = App\Flight::where('active', 1)
    ->orderBy('name', 'desc')
    ->take(10)
    ->get();

注:由于 Eloquent 模型本质上就是查询构建器,你可以在 Eloquent 查询中使用查询构建器的所有方法。

集合

对 Eloquent 中获取多个结果的方法(比如 all 和 get)而言,其返回值是 Illuminate\Database\Eloquent\Collection 的一个实例,Collection 类提供了多个有用的函数来处理 Eloquent 结果集:

$flights = $flights->reject(function ($flight) {
 return $flight->cancelled;
});

当然,你也可以像数组一样循环遍历该集合:

foreach ($flights as $flight) {
 echo $flight->name;
}

组块结果集

如果你需要处理数据量很大的 Eloquent 结果集,可以使用 chunk 方法。chunk 方法会获取一个指定数量的 Eloquent 模型“组块”,并将其填充到给定闭包进行处理。使用 chunk 方法在处理大量数据集合时能够有效减少内存消耗:

Flight::chunk(200, function ($flights) {
 foreach ($flights as $flight) {
  //
 }
});

传递给该方法的第一个参数是你想要获取的“组块”数目,闭包作为第二个参数被传入用于处理每个从数据库获取的组块数据。

使用游标

cursor 方法允许你使用游标迭代处理数据库记录,一次只执行单个查询,在处理大批量数据时,cursor 方法可大幅减少内存消耗:

foreach (Flight::where('foo', 'bar')->cursor() as $flight) {
 //
}

获取单个模型/聚合结果

当然,除了从给定表中获取所有记录之外,还可以使用 find 和 first 获取单个记录。这些方法返回单个模型实例而不是模型集合:

// 通过主键获取模型...
$flight = App\Flight::find(1);

// 获取匹配查询条件的第一个模型...
$flight = App\Flight::where('active', 1)->first();

还可以通过传递主键数组来调用 find 方法,这将会返回匹配记录集合:

$flights = App\Flight::find([1, 2, 3]);

Not Found 异常

有时候你可能想要在模型找不到的时候抛出异常,这在路由或控制器中非常有用,findOrFail 和 firstOrFail 方法会获取查询到的第一个结果。不过,如果没有任何查询结果,Illuminate\Database\Eloquent\ModelNotFoundException 异常将会被抛出:

$model = App\Flight::findOrFail(1);
$model = App\Flight::where('legs', '>', 100)->firstOrFail();

如果异常没有被捕获,那么 HTTP 404 响应将会被发送给用户,所以在使用这些方法的时候没有必要对返回 404 响应编写额外的检查:

Route::get('/api/flights/{id}', function ($id) {
 return App\Flight::findOrFail($id);
});

获取聚合结果

当然,你还可以使用查询构建器提供的聚合方法,例如 count、sum、max,以及其它查询构建器提供的聚合函数。这些方法返回计算后的结果而不是整个模型实例:

$count = App\Flight::where('active', 1)->count();
$max = App\Flight::where('active', 1)->max('price');

插入/更新模型

插入

想要在数据库中插入新的记录,只需创建一个新的模型实例,设置模型的属性,然后调用 save 方法:

<?php

namespace App\Http\Controllers;

use App\Flight;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class FlightController extends Controller{
 /**
  * 创建一个新的航班实例
  *
  * @param Request $request
  * @return Response
  * @translator laravelacademy.org
  */
 public function store(Request $request)
 {
  // 验证请求...

  $flight = new Flight;

  $flight->name = $request->name;

  $flight->save();
 }
}

在这个例子中,我们只是简单分配 HTTP 请求中的 name 参数值给 App\Flight 模型实例的 name 属性,当我们调用 save 方法时,一条记录将会被插入数据库。created_at 和 updated_at 时间戳在 save 方法被调用时会自动被设置,所以没必要手动设置它们。

更新

save 方法还可以用于更新数据库中已存在的模型。要更新一个模型,应该先获取它,设置你想要更新的属性,然后调用 save 方法。同样,updated_at 时间戳会被自动更新,所以没必要手动设置其值:

$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();

批量更新

更新操作还可以同时修改给定查询提供的多个模型实例,在本例中,所有有效且 destination=San Diego 的航班都被标记为延迟:

App\Flight::where('active', 1)
  ->where('destination', 'San Diego')
  ->update(['delayed' => 1]);

update 方法要求以数组形式传递键值对参数,代表着数据表中应该被更新的列。

注:通过 Eloquent 进行批量更新时,saved 和 updated 模型事件将不会在更新模型时触发。这是因为在进行批量更新时并没有从数据库获取模型。

批量赋值

还可以使用 create 方法保存一个新的模型。该方法返回被插入的模型实例。但是,在此之前,你需要指定模型的 fillable 或 guarded 属性,因为所有 Eloquent 模型都通过批量赋值(Mass Assignment)进行保护,这两个属性分别用于定义哪些模型字段允许批量赋值以及哪些模型字段是受保护的,不能显式进行批量赋值。

当用户通过 HTTP 请求传递一个不被期望的参数值时就会出现安全隐患,然后该参数以不被期望的方式修改数据库中的字段值。例如,恶意用户通过 HTTP 请求发送一个 is_admin 参数,然后该参数映射到模型的 create 方法,从而允许用户将自己变成管理员。

所以,你应该在模型中定义哪些属性是可以进行赋值的,使用模型上的 $fillable 属性即可实现。例如,我们设置 Flight 模型上的 name 属性可以被赋值:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
 /**
  * 可以被批量赋值的属性.
  *
  * @var array
  */
 protected $fillable = ['name'];
}

设置完可以被赋值的属性之后,我们就可以使用 create 方法在数据库中插入一条新的记录。create 方法返回保存后的模型实例:

$flight = App\Flight::create(['name' => 'Flight 10']);

如果你已经有了一个模型实例,可以使用 fill 方法通过数组属性来填充:

$flight->fill(['name' => 'Flight 22']);

黑名单属性

$fillable 就像是可以被赋值属性的“白名单”,还可以选择使用 $guarded。$guarded 属性包含你不想被赋值的属性数组。所以不被包含在其中的属性都是可以被赋值的,因此,$guarded 功能就像“黑名单”。当然,这两个属性你只能同时使用其中一个而不能一起使用,因为它们是互斥的。下面的例子中,除了 price 之外的所有属性都是可以赋值的:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
 /**
  * 不能被批量赋值的属性
  *
  * @var array
  */
 protected $guarded = ['price'];
}

如果你想要让所有属性都是可批量赋值的,可以将 $guarded 属性设置为空数组:

/**
 * The attributes that aren't mass assignable.
 *
 * @var array
 */
protected $guarded = [];

其它创建方法

firstOrCreate/firstOrNew

还有其它两种可以用来创建模型的方法:firstOrCreate 和 firstOrNew。firstOrCreate 方法先尝试通过给定列/值对在数据库中查找记录,如果没有找到的话则通过给定属性创建一个新的记录。

firstOrNew 方法和 firstOrCreate 方法一样先尝试在数据库中查找匹配的记录,如果没有找到,则返回一个新的模型实例。需要注意的是,通过 firstOrNew 方法返回的模型实例并没有持久化到数据库中,你还需要调用 save 方法手动持久化:

// 通过属性获取航班, 如果不存在则创建...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);

// 通过name获取航班,如果不存在则通过name和delayed属性创建...
$flight = App\Flight::firstOrCreate(
 ['name' => 'Flight 10'], ['delayed' => 1]
);

// 通过属性获取航班, 如果不存在初始化一个新的实例...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);

// 通过name获取,如果不存在则通过name和delayed属性创建新实例...
$flight = App\Flight::firstOrNew(
 ['name' => 'Flight 10'], ['delayed' => 1]
);

updateOrCreate

与此类似的,你还会碰到如果模型已存在则更新,否则创建新模型的场景,Laravel 提供了一个 updateOrCreate 方法来一步完成。和 firstOrCreate 方法一样,updateOrCreate 方法会持久化模型,所以无需调用 save():

// 如果有从奥克兰到圣地亚哥的航班则将价格设置为 $99
// 如果没有匹配的模型则创建之
$flight = App\Flight::updateOrCreate(
 ['departure' => 'Oakland', 'destination' => 'San Diego'],
 ['price' => 99]
);

删除模型

要删除一个模型,调用模型实例上的 delete 方法:

$flight = App\Flight::find(1);
$flight->delete();

通过主键删除模型

在上面的例子中,我们在调用 delete 方法之前从数据库中获取该模型,不过,如果你知道模型的主键的话,可以调用 destroy 方法直接删除而不需要获取它:

App\Flight::destroy(1);
App\Flight::destroy([1, 2, 3]);
App\Flight::destroy(1, 2, 3);

通过查询删除模型

当然,你还可以通过查询删除多个模型,在本例中,我们删除所有被标记为无效的航班:

$deletedRows = App\Flight::where('active', 0)->delete();

注:通过 Eloquent 进行批量删除时,deleting 和 deleted 模型事件在删除模型时不会被触发,这是因为在进行模型删除时不会获取模型。

软删除

除了从数据库物理删除记录外,Eloquent 还可以对模型进行“软删除”。当模型被软删除后,它们并没有真的从数据库删除,而是在模型上设置一个 deleted_at 属性并插入数据库,如果模型有一个非空 deleted_at 值,那么该模型已经被软删除了。要启用模型的软删除功能,可以使用模型上的Illuminate\Database\Eloquent\SoftDeletes trait 并添加 deleted_at 列到 $dates 属性:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Flight extends Model
{
 use SoftDeletes;

 /**
  * 应该被调整为日期的属性
  *
  * @var array
  */
 protected $dates = ['deleted_at'];
}

当然,应该添加 deleted_at 列到数据表。Laravel Schema 构建器包含一个辅助函数来创建该数据列:

Schema::table('flights', function ($table) {
 $table->softDeletes();
});

现在,当调用模型的 delete 方法时,deleted_at 列将被设置为当前日期和时间,并且,当查询一个使用软删除的模型时,被软删除的模型将会自动从查询结果中排除。

判断给定模型实例是否被软删除,可以使用 trashed 方法:

if ($flight->trashed()) {
 //
}

查询被软删除的模型

包含软删除模型

正如上面提到的,软删除模型将会自动从查询结果中排除,不过,如果你想要软删除模型出现在查询结果中,可以使用 withTrashed 方法:

$flights = App\Flight::withTrashed()
   ->where('account_id', 1)
   ->get();

withTrashed 方法也可以用于关联查询中:

$flight->history()->withTrashed()->get();

只获取软删除模型

onlyTrashed 方法只获取软删除模型:

$flights = App\Flight::onlyTrashed()
   ->where('airline_id', 1)
   ->get();

恢复软删除模型

有时候你希望恢复一个被软删除的模型,可以使用 restore 方法:

$flight->restore();

你还可以在查询中使用 restore 方法来快速恢复多个模型,同样,这也不会触发任何模型事件:

App\Flight::withTrashed()
 ->where('airline_id', 1)
 ->restore();

和 withTrashed 方法一样,restore 方法也可以用于关联查询:

$flight->history()->restore();

永久删除模型

有时候你真的需要从数据库中删除一个模型,要从数据库中永久删除记录,可以使用 forceDelete 方法:

// 强制删除单个模型实例...
$flight->forceDelete();

// 强制删除所有关联模型...
$flight->history()->forceDelete();

查询作用域

全局作用域

全局作用域允许我们为给定模型的所有查询添加条件约束。Laravel 自带的软删除功能就使用了全局作用域来从数据库中拉出所有没有被删除的模型。编写自定义的全局作用域可以提供一种方便的、简单的方式来确保给定模型的每个查询都有特定的条件约束。

编写全局作用域

自定义全局作用域很简单,首先定义一个实现 Illuminate\Database\Eloquent\Scope 接口的类,该接口要求你实现一个方法:apply。需要的话可以在 apply 方法中添加 where 条件到查询:

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class AgeScope implements Scope
{
 /**
  * 应用作用域到给定的Eloquent查询构建器.
  *
  * @param \Illuminate\Database\Eloquent\Builder $builder
  * @param \Illuminate\Database\Eloquent\Model $model
  * @return void
  * @translator laravelacademy.org
  */
 public function apply(Builder $builder, Model $model)
 {
  return $builder->where('age', '>', 200);
 }
}

Laravel 应用默认并没有为作用域预定义文件夹,所以你可以按照自己的喜好在 app 目录下创建 Scopes 目录。

注:如果你的全局作用域需要添加列到查询的 select 子句,需要使用 addSelect 方法来替代 select,这样就可以避免已存在的 select 查询子句造成影响。

应用全局作用域

要将全局作用域应用到模型,需要重写给定模型的 boot 方法并使用 addGlobalScope 方法:

<?php

namespace App;

use App\Scopes\AgeScope;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
 /**
  * 模型的“启动”方法.
  *
  * @return void
  */
 protected static function boot()
 {
  parent::boot();

  static::addGlobalScope(new AgeScope);
 }
}

添加作用域后,如果使用 User::all() 查询则会生成如下 SQL 语句:

select * from `users` where `age` > 200

匿名的全局作用域

Eloquent 还允许我们使用闭包定义全局作用域,这在实现简单作用域的时候特别有用,这样的话,我们就没必要定义一个单独的类了:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class User extends Model{
 /**
  * The "booting" method of the model.
  *
  * @return void
  */
 protected static function boot()
 {
  parent::boot();

  static::addGlobalScope('age', function(Builder $builder) {
   $builder->where('age', '>', 200);
  });
 }
}

移除全局作用域

如果想要在给定查询中移除指定全局作用域,可以使用 withoutGlobalScope 方法,该方法接收全局作用域的类名作为其唯一参数:

User::withoutGlobalScope(AgeScope::class)->get();

或者,如果你使用闭包定义的全局作用域的话:

User::withoutGlobalScope('age')->get();

如果你想要移除某几个或全部全局作用域,可以使用 withoutGlobalScopes 方法:

// 移除所有全局作用域
User::withoutGlobalScopes()->get();

 //移除某些全局作用域
 User::withoutGlobalScopes([FirstScope::class, SecondScope::class])->get();

本地作用域

本地作用域允许我们定义通用的约束集合以便在应用中复用。例如,你可能经常需要获取最受欢迎的用户,要定义这样的一个作用域,只需简单在对应 Eloquent 模型方法前加上一个 scope 前缀。

作用域总是返回查询构建器实例:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
 /**
  * 只包含活跃用户的查询作用域
  *
  * @return \Illuminate\Database\Eloquent\Builder
  */
 public function scopePopular($query)
 {
  return $query->where('votes', '>', 100);
 }

 /**
  * 只包含激活用户的查询作用域
  *
  * @return \Illuminate\Database\Eloquent\Builder
  */
 public function scopeActive($query)
 {
  return $query->where('active', 1);
 }
}

使用本地作用域

作用域被定义好了之后,就可以在查询模型的时候调用作用域方法,但调用时不需要加上 scope 前缀,你甚至可以同时调用多个作用域,例如:

$users = App\User::popular()->active()->orderBy('created_at')->get();

动态作用域

有时候你可能想要定义一个可以接收参数的作用域,你只需要将额外的参数添加到你的作用域即可。作用域参数应该被定义在 $query 参数之后:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
 /**
  * 让查询只包含给定类型的用户
  *
  * @param \Illuminate\Database\Eloquent\Builder $query
  * @param mixed $type
  * @return \Illuminate\Database\Eloquent\Builder
  */
 public function scopeOfType($query, $type)
 {
  return $query->where('type', $type);
 }
}

现在,你可以在调用作用域时传递参数了:

$users = App\User::ofType('admin')->get();

比较模型

有时候你可能需要确定两个模型是否是一样的,is 方法可用于快速验证两个模型是否有相同的主键、数据表、以及数据库连接:

if ($post->is($anotherPost)) {
 //
}

事件

Eloquent 模型可以触发事件,允许你在模型生命周期中的多个时间点调用如下这些方法:retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。事件允许你在一个指定模型类每次保存或更新的时候执行代码。

retrieved 事件会在从数据库中获取已存在模型时触发。当一个新模型被首次保存的时候,creating 和 created 事件会被触发。如果一个模型已经在数据库中存在并调用 save 方法,updating/updated 事件会被触发,无论是创建还是更新,saving/saved 事件都会被触发。

注:通过 Eloquent 进行批量更新时,模型事件 saved 和 updated 不会在更新模型上触发,这是因为这些模型在进行批量更新时没有真正检索过。

举个例子,在 Eloquent 模型中定义一个 $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;

 /**
  * The event map for the model.
  *
  * @var array
  */
 protected $dispatchesEvents = [
  'saved' => UserSaved::class,
  'deleted' => UserDeleted::class,
 ];
}

观察者

定义观察者

如果你在给定模型中监听多个事件,可以使用观察者来对所有监听器分组到一个类中,观察者类拥有反射你想要监听的 Eloquent 事件对应的方法名,每个方法接收模型作为唯一参数。Artisan 命令 make:observer 是创建新的观察者类的最简单的方法:

php artisan make:observer UserObserver --model=User

该命令会将新的观察者生成到 App/Observers 目录,如果这个目录不存在,Artisan 会自动创建。刚创建的观察者类代码如下:

<?php

namespace App\Observers;

use App\User;

class UserObserver
{
 /**
  * Handle to the User "created" event.
  *
  * @param \App\User $user
  * @return void
  */
 public function created(User $user)
 {
  //
 }

 /**
  * Handle the User "updated" event.
  *
  * @param \App\User $user
  * @return void
  */
 public function updated(User $user)
 {
  //
 }

 /**
  * Handle the User "deleted" event.
  *
  * @param \App\User $user
  * @return void
  */
 public function deleted(User $user)
 {
  //
 }
}

要注册观察者,使用你想要观察模型的 observe 方法,你可以在某个服务提供者的 boot 方法中注册观察者,在本例中,我们在 AppServiceProvider 中注册观察者:

<?php

namespace App\Providers;

use App\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
 /**
  * Bootstrap any application services.
  *
  * @return void
  */
 public function boot()
 {
  User::observe(UserObserver::class);
 }

 /**
  * Register the service provider.
  *
  * @return void
  */
 public function register()
 {
  //
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • laravel Model 执行事务的实现

    1.官方手册是这样介绍的: 想要在一个数据库事务中运行一连串操作,可以使用DB门面的transaction方法,如果事务闭包中抛出异常,事务将会自动回滚.如果闭包执行成功,事务将会自动提交.使用transaction方法时不需要担心手动回滚或提交: DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); }); 手动使用事务 如果你想要手

  • laravel5 Eloquent 实现事务方式

    1.官方手册是这样介绍的: 想要在一个数据库事务中运行一连串操作,可以使用DB门面的transaction方法,如果事务闭包中抛出异常,事务将会自动回滚.如果闭包执行成功,事务将会自动提交.使用transaction方法时不需要担心手动回滚或提交: DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); }); 手动使用事务 如果你想要手

  • 在laravel中实现事务回滚的方法

    之前做项目用到了事务回滚这个机制.我把代码贴出来多多交流给点意见,我用的是laravel 5.1bane版本的, public static function createDeal($to_status, $params, $new_balance, $update = true) { \DB::beginTransaction(); try { $update_order_status = \DB::table('wallet_order') ->where('order_id', $para

  • Laravel5.7 Eloquent ORM快速入门详解

    简介 Laravel 内置的 Eloquent ORM 提供了一个美观.简单的与数据库打交道的 ActiveRecord 实现,每张数据表都对应一个与该表进行交互的模型(Model),通过模型类,你可以对数据表进行查询.插入.更新.删除等操作. 在开始之前,确保在 config/database.php 文件中配置好了数据库连接.更多关于数据库配置的信息,请查看文档. 定义模型 我们从创建一个 Eloquent 模型开始,模型类通常位于 app 目录下,你也可以将其放在其他可以被 compose

  • Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用.事实上,我们可以是用 interval 这一个库来完成我们需要的操作. 区间判断基础 最基础的区间判断操作就是先创建一个区间几个,然后使用 in 来判断一个数是否存在于区间之内.代码如下: from interval import Interval zoom_2_5 = Interval(2, 5)

  • SpringBoot快速入门详解

    Spring Boot是什么? Spring Boot并不是什么新的框架,它是对Spring的缺点进行了改善和优化,Spring Boot默认了很多的框架使用方式,像maven整合了所以jar包同一个道理.及SpringBoot并不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式而已. 为什么使用Spring Boot? Spring Boot官方是这么说的:Spring Boot它是基于Spring开发项目的起点,Spring Boot的设计主要是让你快速地跑起来Spri

  • python飞机大战 pygame游戏创建快速入门详解

    本文实例讲述了python飞机大战 pygame游戏创建.分享给大家供大家参考,具体如下: 目标 项目准备 使用 pygame 创建图形窗口 理解 图像 并实现图像绘制 理解 游戏循环 和 游戏时钟 理解 精灵 和 精灵组 项目准备 新建 飞机大战 项目 新建一个 hm_01_pygame入门.py 导入 游戏素材图片 游戏的第一印象 把一些 静止的图像 绘制到 游戏窗口 中 根据 用户的交互 或其他情况,移动 这些图像,产生动画效果 根据 图像之间 是否发生重叠,判断 敌机是否被摧毁 等其他情

  • Spring Boot Admin 快速入门详解

    目录 1.介绍 2.服务端搭建 2.1 引入依赖 2.2 添加注解 2.3 进行测试 2.4 测试结果 3.客户端搭建 3.1 引入依赖 3.2 编写配置 3.3 进行测试 4.安全性 4.1 添加依赖 4.2 编写配置 4.3 编写配置类 4.4 修改客户端配置 4.5 进行测试 总结 1.介绍 官网地址 Spring Boot Admin 是开源社区孵化的项目,用于对 Spring Boot 应用的管理和监控.Spring Boot Admin 分为服务端(spring-boot-admin

  • Java Apache Shiro安全框架快速开发详解流程

    目录 一.Shiro简介: shiro功能: Shiro架构(外部) Shiro架构(内部) 二.快速入门 1.拷贝案例 2.分析代码 三.SpringBoot 集成 Shiro 1.编写测试环境 2.使用 1.登录拦截 2.用户认证 四.Shiro整合Mybatis 五.实现请求授权 六.Shiro整合Thymeleaf 一.Shiro简介: Apache Shiro是一个Java的安全(权限)框架. Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在Ja

  • vite.config.js配置入门详解

    目录 1 如何创建vite项目? 2 如何让vite项目启动时自动打开浏览器? 3vite启动默认端口为3000?如何更改默认端口? 4 vite如何设置热更新? 5vite中如何配置别名路径? 6 vite中如何设置便捷图片路径引用? 7如何把vite打包以后的js,css和img资源分别分门别类在js/css/img文件夹中? 8 如何通过vite给项目配置多个环境? 9 vite中如何配置多入口,进行多页面开发? 10 如何设置开启生产打包分析文件大小功能?类似webpack-bundle

  • laravel5 使用try catch的实例详解

    在laravel5中使用以下代码并没有捕获异常 try{ var_dump($val); }catch (Exception $e){ var_dump($e); echo $e->getMessage(); } Laravel 5 时代控制器被强制放到了子命名空间下,这样直接就无法调用根命名空间下的 Exception 类了.Laravel 4 的控制器在跟命名空间下,是可以直接使用的.PHP 5.3 以后所有类就默认在命名空间下了,如果不声明,就默认在顶级命名空间下. 所以要使用try ca

  • Spring之ORM模块代码详解

    Spring框架七大模块简单介绍 Spring中MVC模块代码详解 ORM模块对Hibernate.JDO.TopLinkiBatis等ORM框架提供支持 ORM模块依赖于dom4j.jar.antlr.jar等包 在Spring里,Hibernate的资源要交给Spring管理,Hibernate以及其SessionFactory等知识Spring一个特殊的Bean,有Spring负责实例化与销毁.因此DAO层只需要继承HibernateDaoSupport,而不需要与Hibernate的AP

  • python二维码操作:对QRCode和MyQR入门详解

    python是所有编程语言中模块最丰富的 生活中常见的二维码功能在使用python第三方库来生成十分容易 三个大矩形是定位图案,用于标记二维码的大小.这三个定位图案有白边,通过这三个矩形就可以标识一个二维码了. QRCode 生成这个二维码只用一行 import qrcode qrcode.make("不睡觉干嘛呢").get_image().show() #设置URL必须添加http:// 安装导入QRCode pip install qrcode #方法多,体量小 安装导入MyQR

随机推荐