Laravel框架学习(ORM<二>)

1、一对一

一对一是最简单的关联关系,表示表A和表B的记录一一对应,比如一个用户对应一个社交账号,在演示该关联关系之前我们先创建一个社交账号表user_accounts:

php artisan make:migration create_user_accounts_table --create=user_accounts

编辑生成的迁移文件如下:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUserAccountsTable extends Migration
{
   
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
   
        Schema::create('user_accounts', function (Blueprint $table) {
   
            $table->increments('id');
            $table->integer('user_id');
            $table->string('qq',20)->nullable();
            $table->string('weixin',100)->nullable();
            $table->string('weibo',100)->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
   
        Schema::drop('user_accounts');
    }
}

然后运行Artisan命令:

php artisan migrate

再使用如下Artisan命令生成模型UserAccount:

php artisan make:model Models/UserAccount

接下来我们开始在User中定义与UserAccount的一对一对应关系:

public function account()
{
   
    return $this->hasOne('App\Models\UserAccount');
}

最后在控制器中编写测试代码如下:

$account = User::find(1)->account; dd($account);

浏览器中会输出相对应的UserAccount模型实例。
相对的,我们也可以在UserAccount模型中定义与User的一对一关系:

public function user()
{
   
    return $this->belongsTo('App\User');
}

相应的测试代码为:

$user = UserAccount::find(1)->user; dd($user);

上述代码会输出相应的User模型实例。
上述代码会输出相应的User模型实例。

注意我们并没有在调用belongsTo的时候指定相应的外键信息,那么Eloquent模型底层是怎么判断User与UserAccount的对应关系的呢?

默认情况下,Eloquent将调用belongsTo的关联方法名user作为关联关系 relation relation.’_id’作为默认外键名对应users表的id,如果表中没有相应列,又没有在定义关联关系的时候指定具体的外键,就会报错。

那么又该如何在定义关联关系的时候指定外键呢?

实际上在底层无论是hasOne方法还是belongsTo方法都可以接收额外参数,比如如果user_accounts中关联users的外键是 foreignkeyusers

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值