一、Laravel 5.1框架模型查询作用域定义
模型作用域可以用于定义通用查询的约束条件,避免在控制器或其他地方重复编写查询代码。当需要按照一些常见的查询条件(例如用户状态为激活状态)过滤或限制查询时,可以使用模型作用域来定义这些查询条件。
定义模型作用域非常简单,只需要在模型类里定义一个名为scope*的公共函数即可。例如,如果要定义一个名为active的查询作用域,可以在模型类里定义一个名为scopeActive的函数。
```
public function scopeActive($query)
{
return $query->where('status', 1);
}
```
上述代码定义了一个名为active的查询作用域,以限制查询结果只包含status字段值为1(即激活状态)的记录。
二、模型作用域使用示例
我们来看一个完整的模型作用域的使用示例:
1. 创建一个测试模型类
创建一个新的测试模型,新建文件TestModel.php,内容如下:
```
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class TestModel extends Model
{
protected $table = 'test_table'; // 表名
protected $primaryKey = 'id'; // 主键名
public $timestamps = false; // 是否维护created_at和updated_at字段
// 定义查询作用域active
public function scopeActive($query)
{
return $query->where('status', 1);
}
// 定义查询作用域type
public function scopeType($query, $val)
{
return $query->where('type', $val);
}
}
```
这里我们定义了两个查询作用域,分别是active和type。
2. 在控制器中使用模型作用域进行查询
在控制器中调用模型的active查询作用域,代码如下:
```
namespace App\Http\Controllers;
use App\Models\TestModel;
class TestController extends Controller
{
public function index()
{
// 调用模型的active查询作用域
$list = TestModel::active()->get();
return view('index', [
'list' => $list,
]);
}
}
```
这里我们调用TestModel模型的active查询作用域来查询status字段值为1的记录。
3. 在控制器中使用多个模型作用域进行查询
在控制器中调用模型的多个查询作用域,代码如下:
```
namespace App\Http\Controllers;
use App\Models\TestModel;
class TestController extends Controller
{
public function index()
{
// 调用模型的active和type查询作用域
$list = TestModel::active()->type('A')->get();
return view('index', [
'list' => $list,
]);
}
}
```
这里我们调用TestModel模型的active和type查询作用域,查询status字段值为1且type字段值为A的记录。
三、总结
通过模型作用域定义与使用示例,我们可以看出模型作用域的用途是定义通用的查询条件,使代码更加简洁和易于维护。在实际使用中,我们可以根据需求编写不同的查询作用域,以满足复杂的查询需求。