我们已经介绍过了migration和model的内容。
后面接着讲解model。
讲解它的什么呢?
讲解model和model之间的关联性。
关联性有三个:一对一
、一对多
、多对多
。
这些关联性,并不是通过什么数据库上面划上一条线实现的。
实际上是透过一些方法
,透过一些特别约定的栏位
做到的。
我有一家书店,书店是一个model:Store。
但是我的这个书店只有一本书:Book。
那么书店和书就是一对一
。
php artisan make:model Store -m
我们只有写一行,就是增加了一个栏位,表示书店的title。
php artisan migrate
这样就会帮助我们建立一个表格。
接下来,我们要告诉书店,你有一本书哦~
这个是要怎么做呢?
这个是要操作Store这个Model
。
我们想要表达的意思是,我们的Store当中是有一本书的。
我们在Store这个类当中写一个方法,这个方法叫做book()。
然后在这个book()方法当中,我们返回一个内容:
return $this->hasOne('App\Models\Book');
上面是对Store的操作啦。
Store当中我们写了一个方法,这个方法叫做book(),这个方法的作用就是返回一个book。
下一步我们就要操作Book这里,毕竟是需要双方都关联起来才是可以的。
我们需要在Book对应的资料表当中新增一个栏位。这个栏位应该是store_id
。
如果Book对应的一对一的Model是叫做Abc,那么这个栏位就应该是abc_id
。
这个东西,算是一种惯例啦。
所以,我们要做的就是要对Book这个资料表,要建立一个栏位。
那么在laravel当中,不管我们是新增、修改、删除栏位,我们都是要使用migration来操作的。
然后在migration当中我们添加我们需要的栏位:
$table->integer('store_id')->nullable();
nullable()这个意思是说,这个栏位,可以是空的哦。
然后我们执行migration:
然后我们去数据库当中看一看:
有个这个玩意之后,所有的东西就都连接起来了。
透过上面的写法,我们就做好了书店和书籍的关联
。
这个就是一对一的关联
。
通过上面的例子:
$s1 = Store::create(['title' => '一元商店']);
通过这个东西就建立起来了一个书店的数据。
数据库当中已经有了一条记录了。
看上面的图片,我们现在是有一个s1的store,我们是有一个b1的book,对吧。
然后最最最最最关键的步骤来了哦!!!!
$s1->book()->save($b1)
这样就将这本书,放到了store当中,就产生了关联了哦~~
在books的数据库表当中,就可以看到store_id这个东西就有值了。
看上面的图片,我们通过$1->book->title
就可以查询出来这本书的title。
从store到book的一对一,这个方法,这是已经设定成功了。
但是从book到store的一对一,我们还没有设定的哦。
你看,我们是查不到的。
我们应该怎么做呢?
我们还是应该在Book这本书当中写我们的方法:
我们呢,在Book这个model当中写了一个方法store()这个方法,然后使用了belongsTo方法,就能够反向一对一关联了。
什么一间书店只有一本书,这个肯定是扯淡啦~
宁丹琳也说了,这个是不合理的。
我们需要书店当中有很多书,这个情况,就是一对多的情况。
public function books(){
return $this->hasMany('App\Models\Book');
}
通过上面的写法,我们就可以查询到这个商店当中到底是有哪些书籍的。
通过上面的验证,其实我们就已经知道了。
books方法其实就是等于添加了一个动态属性book。
在资料库当中新建一本书:
然后我们将上面的,我们新建的这个书,也存到我们的books当中。
这样我们执行$s->books
就可以看到两本书了。
我们可以在官网的上面的位置,就可以查询到这种东西了。
A model
A model
当中写一个b方法,这个方法返回hasOne
去反查一个B ModelB Model
当中新增一个栏位,这个栏位是a_id
。B Model
当中写一个a方法,这个方法返回belongsTo
就可以反查到A Model了。