laravel的Eloquent起步

1.简介
	默认创建的Eloquent模型,位于 'app' 目录下,也可以将其放在其它可以被composer.json文件自动加载的地方。
	所有Eloquent模型都继承自 'Illuminate\Database\Eloquent\Model'
	可以将Eloquent模型,看作是我们之前的数据库 '查询构造器'
2.创建Eloquent模型
	生成User模型
		php artisan make:model User 	// 创建一个User模型,默认会生成 'App/User.php'
	生成模型类到 'App/Model' 下
		php artisan make:model Model/User 	// 生成到Model子目录下
	生成模型时,同时生成数据库迁移,使用 '--migration' 或 '-m'
		php artisan make:model User --migration
		php artisan make:model User -m
3.Eloquent模型约定:
	针对 'flights' 数据表,模型类名为 'Flight':
		<?php
			namespace App;
			use Illuminate\Database\Eloquent\Model;
			class Flight extends Model{
			    //
			}
	1>表名:
		默认,模型的数据表是 '模型名' 的复数作为对应的表名,例如:Flight <=对应=> flights。
		可定义 '$table' 属性,来自定义模型对应的表名:
			protected $table = 'my_flights';
	2>主键:
		默认,模型认为每张表的主键名为 'id',可定义 '$primaryKey' 属性来改变
			protected $primaryKey = 'user_id';
	3>时间戳:
		默认,Eloquent期望 'created_at' 和 'updated_at' 在数据表中,不想要Laravel自动管理的这2个字段,设置 '$timestamps' 为 false
			public $timestamps = false;
	4>自定义时间戳格式:
		设置 '$dateFormat' 属性。决定 '日期被如何存储到数据库中' 以及 '日期被如何存储到数据库中'
			protected $dateFormat = 'U';
	5>数据库连接:
		默认情况下,所有的Eloquent模型,使用默认数据库连接(就是 'mysql' 配置段),可设置 '$connection' 来改变:
			protected $connection = 'mysql_2';
4.创建完模型及关联的数据表后,开始获取数据(Eloquent模型看作功能强大的查询构建器)
	use App\Model\Flight;		// 引入Eloquent的 'Flight' 模型类
	class FlightController extends Controller{
		public function index()
	    {

	    	/*
	    		$flights 是一个数组,数组中每个元素是一个 'StdClass' 对象
	    		foreach ($flights as $flight) {
				    echo $flight->name;
				}
	    	 */
	        $flights = Flight::all();	// 使用模型类的 'all()' 方法
	        return view('flight.index', ['flights' => $flights]);
	    }	
	}

	1>添加额外约束:
		$flights = App\Flight::where('active', 1)
	               ->orderBy('name', 'desc')
	               ->take(10)
	               ->get();
	    注意:
	    	Eloquent 模型本质上就是查询构建器,你可以在Eloquent查询中使用查询构建器的所有方法。
	2>集合
		获取多个结果集的方法,返回值是 'Illuminate\Database\Eloquent\Collection' 的一个实例,'Collection'类提供了多个函数来操作结果,我们最常使用的就是 '当作数组' 来循环集合:
    		foreach ($flights as $flight) {
			    echo $flight->name;
			}
	3>使用chunk命令:
		Flight::chunk(200, function ($flights) {
		    foreach ($flights as $flight) {
		        //
		    }
		});
	4>获取单个模型/聚合
		find() - 通过主见获取模型
			$flight = App\Flight::find(1);
		first() - 获取第一条模型
			$flight = App\Flight::where('active', 1)->first();
		以下2个获取单条记录的方法(同上面2个使用方法一致),查找不到的时候会抛出异常:
			findOrFail()
			firstOrFail()
		如果异常没有被捕获,将会发送 'HTTP 404' 响应,所以,在使用这些方法的时候没有必要对返回404响应编写明确的检查。对于 'api接口' 来请求数据,可以直接这么做:
			Route::get('/api/flights/{id}', function ($id) {
			    return App\Flight::findOrFail($id);
			});
	5>获取聚合:
		count()
		sum()
		max()
		avg()
	6>基本插入:
		想要在数据库中插入新的记录,只需创建一个新的模型实例,设置模型的属性,然后调用save方法:
		$flight = new Flight;	// 1.创建模型实例
		$flight->name = $request->name;		// 2.设置name字段
		$flight->save();		// 保存数据,将数据插入到数据库
		注意:
			created_at 和 updated_at 字段,在save()调用时,被自动设置,不用手动设置!
	7>基本更新:
		1)对于更新一个模型,首先获取它,再设置想要的更新,然后调用save方法。同样,updated_at时间戳会被自动更新:
			$flight = App\Flight::find(1);
			$flight->name = 'New Flight Name';
			$flight->save();
		2)更新查询出来的多个模型实例:
			App\Flight::where('active', 1)
	          			->where('destination', 'San Diego')
	          			->update(['delayed' => 1]);
	8>批量赋值:
		使用create()方法,创建一个新的模型。该方法返回被插入的模型实例。但是,在此之前,你需要指定模型的fillable或guarded属性,因为所有Eloquent模型都通过批量赋值(Mass Assignment)进行保护。
			$fillable - 可赋值的属性(白名单)
			$guarded - 不可复制的属性(黑名单)
		firstOrCreate() - 先去数据库查找,未找到则创建一个新的记录
		firstOrNew() - 先去数据库查找,未找到则创建一个模型(返回的模型实例,并未持久化到数据库中,需要调用save()手动持久化)
	9>删除模型:
		delete() - 查询出来的记录删除
		destroy() - 通过主键删除
			App\Flight::destroy(1);
			App\Flight::destroy([1, 2, 3]);
			App\Flight::destroy(1, 2, 3);
	10>软删除
		软删除后,并未真正删除,在模型上设置一个 'deleted_at' 字段(就是我们平常的isshow = 0,添加一个状态位)
		1)启用软删除
			1.使用 'Illuminate\Database\Eloquent\SoftDeletes',并添加 'deleted_at' 到 $dates 属性
				use Illuminate\Database\Eloquent\Model;
				class Flight extends Model{
				    use SoftDeletes;
				    protected $dates = ['deleted_at'];
				}
			2.数据表中,创建 'deleted_at' 字段。Laravel Schema构建器包含一个帮助函数来创建该列:
				Schema::table('flights', function ($table) {
				    $table->softDeletes();
				});
			3.当调用模型的delete方法时,deleted_at列将被设置为当前日期和时间,并且,当查询一个使用软删除的模型时,被软删除的模型将会自动从查询结果中排除。
		2)判断给定模型实例是否被软删除
			trashed()
				if($flight->trashed()){ }
		3)查询数据,包含被软删除的模型:
			withTrashed()
				$flights = App\Flight::withTrashed()->where('account_id', 1)->get();
		4)只获取软删除模型
			onlyTrashed()
				$flights = App\Flight::onlyTrashed()->where('airline_id', 1)->get();
		5)恢复软删除模型
			restore()
				App\Flight::withTrashed()->where('airline_id', 1)->restore();	// 快速恢复多个模型
		6)永久删除模型
			forceDelete()
				$flight->forceDelete();

	11>查询作用域
		1)全局作用域
			按某个 '字段' 来划分,该字段,可能会存在于多张表中,而且多张表中该字段的定义相同!
			软删除的 'deleted_at' 就是这种。设置一个字段的全局作用域,会作用于所有包含该字段的数据表。
			复杂,看文档
		2)本地作用域
			就是在模型类中定义了一些常用的方法,可加入到查询构建器的链式操作中:
				注意:
					在模型类中,定义的方法前加上 'scope' 前缀,就表示 '本地作用域' 了。
				示例:
					class User extends Model{
					    public function scopePopular($query)	// 定义了 '活跃用户' 的查询作用域
					    {
					        return $query->where('votes', '>', 100);
					    }

					    public function scopeActive($query)
					    {
					        return $query->where('active', 1);
					    }
					}
			使用本地查询作用域:
				注意:
					使用时,不需要加 'scope' 前缀
				示例:
					$users = App\User::popular()->active()->orderBy('created_at')->get();
		3)动态作用域
			针对的也是 '本地作用域',不过,可以接收参数:
			示例:
				class User extends Model{
				    public function scopeOfType($query, $type)		// 添加了 'type' 参数
				    {
				        return $query->where('type', $type);
				    }
				}
			使用 '动态作用域'
				$users = App\User::ofType('admin')->get();		// 调用时,传递参数

	12>事件:
		Eloquent模型可以触发事件,允许你在模型生命周期中的多个时间点调用如下这些方法:
			creating, created, updating, updated, saving, saved,deleting, deleted, restoring, restored。
		基本使用:
			一个新模型被首次保存的时候,creating和created事件会被触发。如果一个模型已经在数据库中存在并调用save方法,updating/updated事件会被触发,无论是创建还是更新,saving/saved事件都会被调用。
			在 'AppServerProvider' 服务提供者中,定义Eloquent事件监听器
			示例:
				use App\Model\User;
				class AppServiceProvider extends ServiceProvider{
					public function boot()
				    {
				        User::creating(function ($user) {	// 定义User模型的 'creating' 监听器
				            if ( ! $user->isValid()) {
				                return false;
				            }
				        });
				    }
			    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值