0.什么是有序的是拉弗尔的“ORM”,也就是“对象关系映射”,对象关系映射。ORM似乎帮助我们更方便地操作数据库。
雄辩使一个“模型类”对应一个数据库表,并在底层封装了许多“函数”,这样可以非常方便地调用模型类。请看下面的代码:
?phpclass Article扩展 English { protected $ fill able=[];}“受保护的$ fill able=[];”这一行代码在这里没有价值,是生成器自动生成的,这里就不讨论了。
这门课简直太简单了。没有命名空间和构造函数。如果不算那一行没有意义的代码,这个文件里只有两个实用的东西:“Article”和“ eloquet”。是的,雄辩是如此令人敬畏。只有继承了雄辩类,才能做很多事情,比如‘first()find()where()order by()’,这就是面向对象的强大力量。
一、雄辩术的基本用法雄辩术的中文文献在http://laravel-china.org/docs/eloquent.
我不再赘述,直接展示雄辩术的几种常见用法的代码。
找到id为2的文章并打印标题。
$ article=article : find(2);echo $文章标题;找到标题为“我就是标题”的文章,打印id。
$ article=article : where(' title ','我就是标题')-first();echo $ article-id;查询出所有文章,循环打印出所有标题。
$ articles=article :3360 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。每个继承了length的类都有两个‘固定用法’‘Article :3360 find($ number)’‘Article :3360 all()’,前者将获得一个具有从数据库中检索到的值的对象,后者将获得一个包含整个数据库的对象集合。
2.所有中间方法,如“where()”、“orderBy()”都可以在“静态”和“非静态链”模式下调用,即“Article:where().”和'第33603360条.-where()'。
3.所有“非固定用法”的调用都需要一个操作来“关闭”。本教程中有两个“关闭操作”:“-get()”和“-first()”。
第二,中间操作流Builder这个词可以随便翻译成构造函数,但是“中间操作流”更容易理解,因为大多数数据库操作都是链式操作。
中间操作流程,请看代码:
Article:where('id ','',10)-where('id ','',20)-orderBy('updated_at ',' desc ')-get();此代码的“: where()-where()-order by()”是中间操作流程。中间操作流程用面向对象的方法来理解,可以概括为一句话:
创建一个对象,并不断修改其属性,最后用一个操作来触发数据库操作。如何找到中间操作流程的线索?
文档中几乎没有关于中间操作流程的任何有价值的信息。那么,我们怎么才能找到这个东西呢?很简单,使用以下代码:
$ builder=article :其中(' title ','我就是标题')-title;然后你会看到以下错误:
为什么会出现错误?因为‘Article : where()’仍然是‘Builder’对象而不是‘Article’对象,所以不能直接取‘title’。
“终结者”法
所谓“终止符”方法,是指n个中间操作流方法处理一个雄辩对象后,触发最终的数据库查询操作,得到返回值。
` first()` ` get()` ` paginate()` ` count()` ` delete()'是比较常见的“终止符”方法,会出现在中间操作流程的末尾,调用SQL到数据库,获取返回数据,处理后返回一个Article对象或者Article对象的集合。
复杂用法示例
复制代码如下:
Article:where('id ','',' 100')-where('id ','',' 200 ')-or here(' top ',1)-belongsToCategory()-where(' category _ level ','',' 1 ')-分页(10);
三、模型之间的关系(关联)1。一对一的关系。
顾名思义,这描述了两个模型之间的一对一关系。这种关系不需要中间表。
如果我们有两个模型:User和Account,分别对应注册用户和消费者,它们之间是一一对应的关系,那么如果我们要使用雄辩提供的一一对应关系方法,表结构应该如下:
用户:帐户id account3360 id.user _ id假设我们需要查询用户模型中对应的账表的信息,那么代码应该是这样的。`/app/models/User.php`:
?phpclass User扩展了雄辩{ protected $ table=' users公共函数hasOneAccount(){ return $ this-hasOne(' Account ',' user_id ',' id ');}}那么,当我们需要使用这种关系的时候,应该如何使用呢?如下所示:
$ account=user : find(10)-hasone account;此时获得的“$Account”是“Account”类的一个实例。
这里最难的一点在于两个外键和local_key的设置,所以大家可以记住在User类中,不管hasOne是谁,第二个参数是‘User _ id’,第三个参数一般是‘id’。由于前面的‘find(10)’已经锁定了id=10,所以对应于这个函数的SQL是: `从user _ id=10的账户中选择* '。
这段代码不仅展示了如何使用一对一的关系,还传达了三个信息,这也是我给大家的建议,使用雄辩:
(1).每个模型中都指定了一个表名。
(2).hasOneAccount关系被写成“有一个帐户()”而不是简单的“帐户()”。
(3)每次使用模型之间的关系都要写好所有的参数,不要省略对应的参数。如果使用belongsTo()关系,您应该编写如下内容:
?phpclass Account扩展了雄辩{ protected $ table=' accountspublic function belongtouser(){ return $ this-belongsTo(' User ',' user_id ',' id ');}}2.一对多的关系。
学习了使用一对一关系的基本方法后,后面的关系就简单多了。
我们引入了一种新的模式:支付,支付记录。表格的结构应该是这样的:
用户:Pay3360 id.user_id用户和pay是一对多的关系,换句话说,一个用户可以有多个Pay,所以Pay表中只有一个‘user _ id’字段。`/app/models/User.php`:
?phpclass User扩展了雄辩{ protected $ table=' users公共函数hasManyPays(){ return $ this-hasMany(' Pay ',' user_id ',' id ');}}那么,当我们需要使用这种关系的时候,应该如何使用呢?如下所示:
$ accounts=user : find(10)-hasManyPays()-get();此时获得的“$accounts”是“照明数据库 eloquet 集合”类的一个实例。大家应该都注意到了,这不是一个简单的`-hasOneAccount `而是`-hasManyPays()-get()`。为什么呢?因为这里是hasmulti ',操作是对象的集合。
对应的belongsTo()的用法与上面的一对一关系相同:
?phpclass Pay扩展了envelocity { protected $ table=' pays ';public function belongtouser(){ return $ this-belongsTo(' User ',' user_id ',' id ');}}3.多对多关系。
多对多关系与以前的关系完全不同,因为多对多关系可能有很多冗余数据,不能存储在以前的表中。
我们定义了两个模型:文章和标签,分别代表文章和标签。他们是多对多的关系。表格的结构应该是这样的:
第:条id.标签3360 id.模型中使用了article _ tag: article _ id标记_ id:
?phpclass Tag扩展了雄辩{ protected $ table=' tagspublic function belongstomanyactole(){ return $ this-belongsToMany(' Article ',' article_tag ',' tag_id ',' Article _ id ');}}需要注意的是,第三个参数是这个类的id,第四个参数是第一个参数的类的id。
和hasMany一样:
$ tagsWithArticles=tag : take(10)-get()-belongstomanyarcole()-get();这里你会得到一个非常复杂的对象,你可以自己‘var _ dump()’。告诉你一个小技巧,` var_dump()`,然后右击Chrome“查看源代码”,可以看到非常整齐的对象/数组展开了。
在这里,我将向您展示一个罕见的用法:
public function parent _ video(){ return $ this-belongsToMany($ this,' video_hierarchy ',' video_id ',' video _ parent _ id ');} public function children _ video(){ return $ this-belongsToMany($ this,' video_hierarchy ',' video_parent_id ',' video _ id ');}是的,你没有错,你可以相信自己。其他关系
Elont还提供了其他三种用法,即“远层次一对多关联”、“多态关联”和“多态多对多关联”。经过以上的学习,我们已经掌握了雄辩模型之间关系的基本概念和使用方法,剩下的几个不常见的方法我们在使用的时候会留着自己探索。
重要技巧:您可能已经在关系预加载中发现,在一对一的关系中,如果我们需要一次查询10个User并带来对应的Account,那么我们需要在数据库中键入1 10个SQL,所以性能非常差。我们可以用一个重要的特征,关系预加载:http://laravel-china.org/docs/eloquent#eager-loading.
直接编码:
$ users=user: with('有一个帐户')-take (10)-get()以这种方式生成的SQL如下所示:
从id在(1,2,3,)使1 10个SQL项变成1 1,性能大大提升。