深入理解 Laravel Eloquent(一)——基本概念及用法

2015-1-4   /   字数:2157   /   阅读数:152106   /   分类: Laravel     

在本系列文章中,我将跟大家一起学习 Eloquent 的基本用法,探索 Eloquent 的各种高级功能,理解 Eloquent 背后的运行原理,并最终达到深入理解、灵活使用 Eloquent 的目的。本系列教程是 Laravel 4 系列入门教程(一)【最适合中国人的Laravel教程】的扩展篇,没看过的话别忘了去看一下哦~

本篇是本系列的第一篇,主要讲述 Eloquent 的基本概念和用法。

什么是 Eloquent

Eloquent 是 Laravel 的 'ORM',即 'Object Relational Mapping',对象关系映射。ORM 的出现是为了帮我们把对数据库的操作变得更加地方便。

Eloquent 让一个 'Model类' 对应一张数据库表,并且在底层封装了很多 'function',可以让 Model 类非常方便地调用。我们以 Learn-Laravel-4 中的 'app/models/Article.php' 为例大致说明一下。这个文件的代码如下:

<?php

class Article extends \Eloquent {

protected $fillable = [];

}

'protected $fillable = [];' 这一行代码在这里没有任何价值,是 generator 自动生成的,在此我们不做讨论。

这个类简直再简单不过了,没有指定命名空间,没有构造函数,如果那一行没有意义的代码也不算上的话,这个文件就只有两个有实际意义的东西: 'Article' 和 '\Eloquent'。没错,Eloquent 就是这么屌炸天,只需要继承一下 Eloquent 类,就可以干 'first() find() where() orderBy()' 等非常非常多的事情,这就是面向对象的强大威力。

Eloquent 基本用法

Eloquent 中文文档在:http://laravel-china.org/docs/eloquent

废话不多说,下面我将直接展示 Eloquent 的几种常见用法的代码,在 MarkDown 编辑器里面纯手打,若有拼写错误大家见谅。

找到 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', '>', 10)->where('id', '<', 20)->orderBy('updated_at', 'desc')->get();

foreach ($articles as $article) {

    echo $article->title;

}

基础使用要点

1. 每一个继承了 Eloquent 的类都有两个 '固定用法' 'Article::find($number)' 'Article::all()',前者会得到一个带有数据库中取出来值的对象,后者会得到一个包含整个数据库的对象合集。

2. 所有的中间方法如 'where()' 'orderBy()' 等都能够同时支持 '静态' 和 '非静态链式' 两种方式调用,即 'Article::where()...' 和 'Article::....->where()'。

3. 所有的 '非固定用法' 的调用最后都需要一个操作来 '收尾',本片教程中有两个 '收尾操作':'->get()' 和 '->first()'。

4. 如果你不理解为什么 'Article' 这个类可以使用 '->where()' '->get()' 等很多方法的话,说明你需要去读一下 PHP 对象继承的文档了:对象继承



下一步:深入理解 Laravel Eloquent(二)——中间操作流(Builder)

WRITTEN BY

avatar

评论:

浪子
2018-05-07 16:10
总结的非常好,谢谢分享,学习了。
simple
2016-11-22 10:15
如何修改$articles里面的值?由于不是直接输出,是传给前端用angular输出 所以需要修改数组里面的值
托尔斯泰
2016-06-15 12:29
最好有文章的发表日期
costa92
2016-06-10 14:03
<ul class="pagination">
   <li class="disabled"> <span>&laquo;</span> </li>
   <li class="active"><span>1</span></li>
  <li><a href="http://localhost/laravel/public/admin/?page=2">2</a></li>
  <li><a href="http://localhost/laravel/public/admin/?page=3">3</a></li>
  <li><a href="http://localhost/laravel/public/admin/?page=4">4</a></li>
<li><a href="http://localhost/laravel/public/admin/?page=2" rel="next">&raquo;</a></li>
</ul>

http://localhost/laravel/public/admin/?page=2   在分页的时候出现?前面多了一个'' / ''请问是什么原因呢?
小错
2016-04-21 11:44
$article = Article::where('id', '>', 10)->where('id', '<', 20)->get();  如果找不到数据,返回的是空数组,我希望它能实现像findOrFail()函数的效果,如果没有找到数据,报异常,请问有方法吗
JohnLui
2016-04-21 11:44
@小错:自己检测数组长度呗
小错
2016-04-21 11:46
@JohnLui:好吧,谢谢啊,那还是得自己处理异常
谢谢
2016-03-23 09:43
一直想问Eloquent 和Model 类有什么区别。
Kaka
2016-02-24 21:34
大哥, 写的非常好, 官方的说明文档作为入门的话稍有门槛, 你写的这篇的话, 就非常合适了, 入门之后可以再去查看官方的文档.
wong
2015-09-03 17:37
我想请教一下, find 中传的主键值 只能对应到表中的id字段吗,如果主键不是id而是post_id, email_id 这种,应该怎么进行配置呢,还能用find来查吗
JohnLui
2015-09-03 22:38
@wong:http://www.golaravel.com/laravel/docs/5.0/eloquent/#basic-usage 第一个红框。
陈祥
2015-08-27 14:44
老师您好,请问 orderby CONVERT( title USING gbk ) COLLATE gbk_chinese_ci asc用-> orderby()这种方式该怎么写啊
怀珠的贝
2017-12-19 11:23
@陈祥:->orderBy(DB::raw('convert(title using gbk)'))
参考链接 https://stackoverflow.com/questions/26465243/mysql-functions-in-query-builder-in-laravel
gux
2015-08-06 20:50
updata at那段代码跟上面id范围的重复了
cp
2015-07-19 14:04
你好,希望能解答一下我在看model.php的疑惑:
public function __call($method, $parameters)
    {
///下面代码应该是如果调用的$method在model类中,则调用实例中的$method,这里有个困惑(in_array($method, ['increment', 'decrement']),可以历遍类中的方法吗 ['increment', 'decrement'])作何解释?
        if (in_array($method, ['increment', 'decrement'])) {

//
            return call_user_func_array([$this, $method], $parameters);
        }
        $query = $this->newQuery();
        return call_user_func_array([$query, $method], $parameters);
    }
JohnLui
2015-07-20 10:52
@cp: in_array 就是他在 PHP 官方文档中的意思
cp
2015-07-20 10:58
@JohnLui:感激不吝回复,我的困惑是if (in_array($method, ['increment', 'decrement'])) 源码中似乎可以判断出$method是否在所有属于该类方法中,但为啥要判断$method是否在 ['increment', 'decrement']数组中?
JohnLui
2015-07-20 11:13
@cp:if (in_array($method, ['increment', 'decrement'])) {
        return call_user_func_array([$this, $method], $parameters);
        }
        $query = $this->newQuery();
        return call_user_func_array([$query, $method], $parameters);

这个逻辑够清楚了吧。。。。。对那两个方法进行特殊处理而已。
cp
2015-07-20 11:20
@JohnLui:刚想入门laravel,还望大牛不吝赐教。
您上面说的先判断调用的方法能否在model类中找到,找不到就构造一个查询器,这个逻辑清楚啊,但是这个判断为啥是在数组['increment', 'decrement']中呢,而且model中也没找到increment、derement方法啊?
再耽误一点点时间哈
JohnLui
2015-07-20 11:56
@cp:哥,$method 是一个字符串。检查是否是这两个特殊字符串,做特殊处理,否则按照正常流程处理。
cp
2015-07-20 12:14
@JohnLui:哎,我一根经了,多谢!
yankeys
2016-08-05 14:31
@JohnLui:哈哈,这个回复亮了
大愚
2015-03-13 19:01
我终于发现where是在哪儿了,这里用了建造者模式。日!断点之前进错了。
大愚
2015-03-13 18:59
在断点分析的时候,发现调用where()   orderBy()这些函数的时候,使用了魔术方法__call()方法,在这个方法里边又使用了调用回调函数的方法。追到这儿,就跟丢了。
然后查看它继承的几个函数,都没有定义where这些函数。这块没搞懂,它是把where这个函数定义在哪儿了。
$query = $this->newQuery();
他这里是通过这个$query对象调用的where。但是也搞清楚这个到底是那个对象。
求分解。
Piece Chao
2015-03-09 11:14
$article = Article::where('id', '>', 10)->where('id', '<', 20)->get();

改:
$articles = ...
JohnLui
2015-03-09 11:37
@Piece Chao:谢谢提醒
viko16
2015-01-16 15:52
正文最后的
“下一步:深入理解 Laravel Eloquent(二)——中间操作流(Builder)”
链接错误啦
JohnLui
2015-01-16 16:08
@viko16:感谢提醒~
包菜兄
2015-01-06 12:43
最后一句话,

> 对象集成的文档  => `对象继承的文档`

分析的很好哟。
JohnLui
2015-01-06 12:58
@包菜兄:谢谢

发表评论:

© 2011-2024 岁寒  |  Powered by Emlog