详解PHP的Laravel框架中Eloquent对象关系映射使用
《:详解PHP的Laravel框架中Eloquent对象关系映射使用》要点: 零、什么是 Eloquent Eloquent 让一个 'Model类' 对应一张数据库表,并且在底层封装了很多 'function',可以让 Model 类非常便利地调用. <?php class Article extends Eloquent { protected $fillable = []; } 'protected $fillable = [];' 这一行代码在这里没有任何价值,是 generator 自动生成的,在此我们不做讨论. 这个类简直再简单不过了,没有指定命名空间,没有构造函数,如果那一行没有意义的代码也不算上的话,这个文件就只有两个有实际意义的东西: 'Article' 和 'Eloquent'.没错,Eloquent 便是这么耪ㄌ欤恍枰坛幸幌 Eloquent 类,就可以干 'first() find() where() orderBy()' 等非常非常多的事情,这便是面向对象的强大威力. 一、Eloquent 基本用法 废话不多说,下面我将直接展示 Eloquent 的几种常见用法的代码. 找到 id 为 2 的文章打印其标题 $article = Article::find(2); echo $article->title; 查找标题为“我是标题”的文章,并打印 id $article = Article::where('title','我是标题')->first(); echo $article->id; 查询出所有文章并循环打印出所有标题 $articles = Article::all(); // 此处得到的 $articles 是一个对象集合,可以在后面加上 '->toArray()' 酿成多维数组. foreach ($articles as $article) { echo $article->title; } 查找 id 在 10~20 之间的所有文章并打印所有标题 $articles = Article::where('id','>',10)->where('id','<',20)->get(); foreach ($articles as $article) { echo $article->title; } 查询出所有文章并循环打印出所有标题,依照 updated_at 倒序排序 $articles = Article::where('id',20)->orderBy('updated_at','desc')->get(); foreach ($articles as $article) { echo $article->title; } 基础使用要点 2. 所有的中间办法如 'where()' 'orderBy()' 等都能够同时支持 '静态' 和 '非静态链式' 两种方式调用,即 'Article::where()...' 和 'Article::....->where()'. 3. 所有的 '非固定用法' 的调用最后都必要一个操作来 '收尾',本片教程中有两个 '收尾操作':'->get()' 和 '->first()'. 二、中间操作流 中间操作流,请看代码: Article::where('id','desc')->get(); 这段代码的 `::where()->where()->orderBy()` 就是中间操作流.中间操作流用面向对象的办法来理解,可以总结成一句话: 创建一个对象,并不断修改它的属性,最后用一个操作来触发数据库操作. 中间操作流这个东西,文档里几乎没有任何有价值的信息,那么,我们该怎么找出这个玩意儿呢?很简单,使用以下代码: $builder = Article::where('title',"我是标题")->title; 然后你就会看到下面的错误: 为什么会出现错误?因为 `Article::where()` 了之后依然是 `Builder` 对象,还不是 `Article` 对象,不能直接取 `title`. “终结者”办法 所谓 “终结者” 办法,指的是在 N 个中间操作流办法对某个 Eloquent 对象进行加工以后,触发最终的数据库查询操作,得到返回值. `first()` `get()` `paginate()` `count()` `delete()` 是用的比较多的一些 “终结者” 办法,他们会在中间操作流的最后出现,把 SQL 打给数据库,得到返回数据,经过加工返回一个 Article 对象或者一群 Article 对象的集合. 复杂用法示例
代码如下:
Article::where('id','100')->where('id','200')->orWhere('top',1)->belongsToCategory()->where('category_level','1')->paginate(10); 三、模型间关系(关联) 顾名思义,这描述的是两个模型之间一对一的关系.这种关系是不必要中间表的. 假如我们有两个模型:User 和 Account,分别对应注册用户和消费者,他们是一对一的关系,那么如果我们要使用 Eloquent 提供的一对一关系办法,表结构应该是这样的: user: id ... ... account_id account: id ... ... user_id 假设我们必要在 User 模型中查询对应的 Account 表的信息,那么代码应该是这样的. `/app/models/User.php`: <?php class User extends Eloquent { protected $table = 'users'; public function hasOneAccount() { return $this->hasOne('Account','user_id','id'); } } 然后,当我们必要用到这种关系的时候,该如何使用呢?如下: $account = User::find(10)->hasOneAccount; 此时得到的 `$account` 即为 `Account` 类的一个实例. 这里最难的地方在于后面的两个 foreign_key 和 local_key 的设置,大家可以就此记住:在 User 类中,无论 hasOne 谁,第二个参数都是 `user_id`,第三个参数一般都是 `id`.由于前面的 `find(10)` 已经锁定了 id = 10,所以这段函数对应的 SQL 为: `select * from account where user_id=10`. 这段代码除了展示了一对一关系该如何使用之外,还传达了三点信息,也是我对于大家使用 Eloquent 时候的建议: (1). 每一个 Model 中都指定表名 (2). has one account 这样的关系写成 `hasOneAccount()` 而不是简单的 `account()` (3). 每次使用模型间关系的时候都写全参数,不要省略 <?php class Account extends Eloquent { protected $table = 'accounts'; public function belongsToUser() { return $this->belongsTo('User','id'); } } 2.一对多关系 学会了前面使用一对一关系的基础办法,后面的几种关系就简单多了. 我们引入一个新的Model:Pay,付款记录.表结构应该是这样的: user: id ... ... pay: id ... ... user_id User 和 Pay 具有一对多关系,换句话说便是一个 User 可以有多个 Pay,这样的话,只在 Pay 表中存在一个 `user_id` 字段即可. `/app/models/User.php`: <?php class User extends Eloquent { protected $table = 'users'; public function hasManyPays() { return $this->hasMany('Pay',该如何使用呢?如下: |