为你自己学laravel - 16 - model之间的关系 - 一对一和一对多

我们已经介绍过了migration和model的内容。

后面接着讲解model。

讲解它的什么呢?

讲解model和model之间的关联性。

关联性有三个:一对一一对多多对多

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第1张图片

这些关联性,并不是通过什么数据库上面划上一条线实现的。

实际上是透过一些方法,透过一些特别约定的栏位做到的。

例子

我有一家书店,书店是一个model:Store。

但是我的这个书店只有一本书:Book。

那么书店和书就是一对一

建一个书店的Store Model

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第2张图片

php artisan make:model Store -m

我们在migration当中添加栏位

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第3张图片

我们只有写一行,就是增加了一个栏位,表示书店的title。

执行migration

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第4张图片

php artisan migrate

这样就会帮助我们建立一个表格。

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第5张图片

一对一

接下来,我们要告诉书店,你有一本书哦~

这个是要怎么做呢?

这个是要操作Store这个Model

我们想要表达的意思是,我们的Store当中是有一本书的。

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第6张图片

我们在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来操作的。

image-20231220230818527

然后在migration当中我们添加我们需要的栏位:

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第7张图片

$table->integer('store_id')->nullable();

nullable()这个意思是说,这个栏位,可以是空的哦。

然后我们执行migration:

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第8张图片

然后我们去数据库当中看一看:

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第9张图片

有个这个玩意之后,所有的东西就都连接起来了。

透过上面的写法,我们就做好了书店和书籍的关联

这个就是一对一的关联

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第10张图片

tinker当中验证一对一

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第11张图片

通过上面的例子:

$s1 = Store::create(['title' => '一元商店']);

通过这个东西就建立起来了一个书店的数据。

数据库当中已经有了一条记录了。

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第12张图片

看上面的图片,我们现在是有一个s1的store,我们是有一个b1的book,对吧。

然后最最最最最关键的步骤来了哦!!!!

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第13张图片

$s1->book()->save($b1)

这样就将这本书,放到了store当中,就产生了关联了哦~~

image-20231220232155376

在books的数据库表当中,就可以看到store_id这个东西就有值了。

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第14张图片

看上面的图片,我们通过$1->book->title就可以查询出来这本书的title。

从store到book的一对一,这个方法,这是已经设定成功了。


但是从book到store的一对一,我们还没有设定的哦。

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第15张图片

你看,我们是查不到的。

我们应该怎么做呢?

我们还是应该在Book这本书当中写我们的方法:

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第16张图片

我们呢,在Book这个model当中写了一个方法store()这个方法,然后使用了belongsTo方法,就能够反向一对一关联了。

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第17张图片

一对多

什么一间书店只有一本书,这个肯定是扯淡啦~

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第18张图片

宁丹琳也说了,这个是不合理的。

我们需要书店当中有很多书,这个情况,就是一对多的情况。

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第19张图片

public function books(){
    return $this->hasMany('App\Models\Book');
}

通过上面的写法,我们就可以查询到这个商店当中到底是有哪些书籍的。

tinker当中验证一对多

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第20张图片

通过上面的验证,其实我们就已经知道了。

books方法其实就是等于添加了一个动态属性book。


在资料库当中新建一本书:

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第21张图片

然后我们将上面的,我们新建的这个书,也存到我们的books当中。

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第22张图片

这样我们执行$s->books就可以看到两本书了。


为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第23张图片

我们可以在官网的上面的位置,就可以查询到这种东西了。

总结

  • 一对一应该怎么做?
    • 建立一个A model
    • A model当中写一个b方法,这个方法返回hasOne去反查一个B Model
    • B Model当中新增一个栏位,这个栏位是a_id
    • B Model当中写一个a方法,这个方法返回belongsTo就可以反查到A Model了。
    • 上面就可以做到一对一。
  • 一对多应该怎么做呢?
    • 在A model当中写一个bs方法,这个方法返回hasMany去反查一对B Model

为你自己学laravel - 16 - model之间的关系 - 一对一和一对多_第24张图片

你可能感兴趣的:(为你自己学laravel,laravel,数据库,oracle)