Laravel 5.4 官方文档摘记:Eloquent ORM

33 篇文章 0 订阅

Eloquent ORM

参数名称与作用

$table 表名

$primaryKey 主键名

$timestamps 新增、删除时间字段

当该参数设置为true时,默认在当前表中存在created_atupdated_at字段,表示该记录创建时间和更新时间。

$dateFormat 时间保存格式

CREATED_ATUPDATED_AT

上面将$timestamps设置为true时,created_atupdated_at字段的名称是由这两个参数指定的。

$connection 数据库连接

注意,这里的$connection不是指真正的数据库连接,而是在config/database.php中的connections中设置的连接名称。

查询

当进行模型操作时,很多命令和直接使用DB进行操作是一样的,这里列出了一些DB的操作

异常查询

  • findOrFail
  • firstOrFail

使用上述命令进行查询时,如果模型不存在,则会抛出异常,异常名称为Illuminate\Database\Eloquent\ModelNotFoundException

插入数据/更新数据 save

插入数据

// 实例化模型
$user=new User;
$user->name="trouble i am in";
$user->age=10;
$user->save();

更新数据

// 查询到实例对象
$user=User::find($user_id);
$user->name="trouble i am in";
$user->age=18;
$user->save();

批量更新 update

跟这里的用法是一样的

指定批量更新字段 $fillable / $guarded

比如你想将POST过来的表单直接保存进数据库,但是又不想用户恶意传递非法字段进来,所以最好的办法就是使用该属性指定填充字段。

$fillable 白名单

$guarded 黑名单

获取模型实例

在使用save进行更新数据之前,需要先获取一个模型实例,上面我们是直接使用find进行查询的,这里介绍更多查询方式:

$user1=User->find(['user_id'=>$user_id]);
$user2=User->findOrCreate(['user_id'=>$user_id]);
$user3=User->firstOrNew(['user_id'=>$user_id]);

上面获取后还需要使用$user->save();进行保存。除了firstOrNew,还有updateOrCreate。这两个操作都不需要使用$user->save();来将数据保存进数据库。

删除模型 delete

$user=User::find(['user_id'=>$user_id]);
$user->delete();

通过主键删除模型 destroy

$user->destroy([
    $user_id1,
    $user_id2,
    $user_id3
]);

软删除

设置软删除

软删除的字段默认为deleted_at。设置软删除的过程如下:

  • deleted_at添加到数据库表字段

  • 调用Illuminate\Database\Eloquent\SoftDeletes

use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model{
    use SoftDeletes;
    protected $datea=['deleted_at'];
}

这样设置完成后,当你对该表做delete操作时,仅仅就是修改deleted_at字段,而不会删除数据库数据了。

获取被软件除模型 withTrashed

只获取被删除模型 onlyTrashed

恢复软删除模型 restore

强制删除模型 forceDelete

查询作用域

所谓查询作用域,就是针对该配置下的每一次查询都要有效。

设置全局作用域

  • Step 1 创建作用域类

该作用域类扩展Illuminate\Database\Eloquent\Scope接口

<?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);
    }
}
  • Step 2 将该类绑定到模型的中
<?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的查询时,都会加上$builder->where('age', '>', 200);这样的限制条件。

使用闭包函数代替上面类

<?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);
        });
    }
}

移除作用域

移除全部全局作用域

User::withoutGlobalScopes()->get();

移除部分全局作用域

User::withoutGlobalScopes([
    FirstScope::class, 
    SecondScope::class
])->get();

设置可设置的作用域(本地作用域)

  • Step 1 设置以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);
    }

    /**
     * 注意,所有的方法都是以 scope 开头
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeActive($query)
    {
        return $query->where('active', 1);
    }
}

在外部可以这样直接调用其中的作用域:

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

设置可传入参数的本地作用域

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 注意,这里加上了额外的外部参数 $type
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeOfType($query, $type)
    {
        return $query->where('type', $type);
    }
}

在外部可以直接在调用该本地作用域的时候传入参数:

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

事件

一个模型被新建的时候触发该事件:

  • creating
  • created

数据被更新的时候触发该事件:

  • updating
  • updated

新增数据或者更新数据都可以使用save()方法,所以都会触发该事件

  • saving
  • saved

删除

  • deleting
  • deleted

软删除

  • restoring
  • restored

第一步:编写处理事件的类

<?php

namespace App\Observers;

use App\User;

class UserObserver
{
    /**
     * 监听用户创建事件.
     *
     * @param  User  $user
     * @return void
     */
    public function created(User $user)
    {
        //
    }

    /**
     * 监听用户删除事件.
     *
     * @param  User  $user
     * @return void
     */
    public function deleting(User $user)
    {
        //
    }
}

第二步:注册观察者

<?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()
    {
        //
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值