• 技术文章 >php框架 >Laravel

    说说Laravel模型关联关系最单纯的“一对一”!

    藏色散人藏色散人2020-10-12 14:10:34转载113

    下面由Laravel教程栏目给大家介绍Laravel模型关联关系最单纯的“一对一”! ,希望对需要的朋友有所帮助!

    引言

    关系型数据库提供了非常好用的数据关联绑定模式,使用SQL语句可以方便地进行关联数据查询和操作。

    如果所有关联关系放到数据库层面操作,势必非常不便。

    所以,laravel模型提供了关联关系,本文就来梳理梳理那些用法。

    代码时间

    我们不要PPT似的念稿子,罗列出所有的关系模型,那样不直观也不是高效学习的方式。

    还是从示例触发,看看关联关系到底解决的是什么问题,以及如何使用。

    首先是数据库的准备,假设有如下两个表的字段对应关系:

    pic

    使用命令行创建一个Profile模型,并同时创建迁移文件:

    php artisan make:model Profile --migration

    来看生成的 app/Profile.php 文件的内容:

    namespace App;use Illuminate\Database\Eloquent\Model;class Profile extends Model {}

    因为使用了 –migration 选项,laravel自动生成了 database/migrations/2020_10_11_015236_create_profiles_table.php 文件,

    用于生成对应的数据库 profiles 表。

    还是老规矩,先实现数据库迁移使用的 up 方法:

    public function up(){
        Schema::create('profiles', function(Blueprint $table)
        {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users');
            $table->string('url');
            $table->string('telephone');
            $table->timestamps();
        });}

    用于回滚的方法就不列出来了,仅仅是表的删除。下面手动执行迁移指令:

    php artisan migrate

    输出内容如下:

    Migrated: 2020_10_11_015236_create_profiles_table.php

    关联关系

    一切准备就绪,我们开始使用关联关系来处理数据的一致性。一个user对应一个profile,所以这是一对一的关系,

    在User模型里添加如下声明:

    class User extends Model {
        public function profile()
        {
            return $this->hasOne('App\Profile');
        }}

    一旦定义了上述方法,就可以这样链式调用了:

    $user = User::find(1)->profile->telephone;

    我们拆解开做解释。首先使用 User::find($id) 返回的是一个 User 模型对象的实例。

    该实例有一个 profile 方法,就是上面这段关系声明。

    调用 profile 返回的是一个 Profile 对象的实例,所以可以继续调用Profile的属性,也就是 telephone 的由来了。

    需要特别注意的是,类似下面的写法,返回结果是不同的:

    $user = User::find($id);
    $user->profile; // 返回 Profile 对象
    $user->profile(); // 返回 hasOne 关联关系对象

    大家在使用的时候,一定不要迷惑,要分清楚使用方法。

    有了关联查询,自然就有关联更新,用法如下:

    $profile = new Profile;
    $profile->telephone = '12345678';
    $user = User::find(1);
    $user->profile()->save($profile);

    有了关联更新这种写操作,自然就有了关联删除,模型方法的调用而已:

    $user = User::find($id);
    $user->profile()->delete();

    由于是严格一对一的关系,也就是一个user只有一个profile,如果某个user被删除了,

    就会剩下一个孤零零的profile无所依附。

    除了在程序上下文的一致性保证外,还可以使用数据库的外键,在删除user时将profile关联删除。那么只要修改迁移文件,

    并添加如下内容:

    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

    写在最后

    本文介绍了laravel模型关联的最简单的“一对一”,我们从程序角度和数据库角度讲解了

    如何在删除资源时的一致性删除。更复杂的关系,在编程层面是有意义的,我们下一章介绍更多的关联关系。

    以上就是说说Laravel模型关联关系最单纯的“一对一”!的详细内容,更多请关注php中文网其它相关文章!

    本文转载于:learnku,如有侵犯,请联系a@php.cn删除
    专题推荐:Laravel
    上一篇:laravel系统自带的文件上传功能 下一篇:Sight!一个杀手级提升Laravel开发速度的组件现在开源了!
    第13期线上培训班

    相关文章推荐

    • WSL2配置laravel环境的方法• laravel new 命令为什么没有效果• 分享Laravel模型使用的2个小技巧• laravel系统自带的文件上传功能

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网