Laravel5.7 Eloquent ORM快速入门详解(7)

$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 查询子句造成影响。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5967.html