0

0

Laravel 中使用自定义主键和外键定义关联关系

聖光之護

聖光之護

发布时间:2025-08-19 18:10:24

|

948人浏览过

|

来源于php中文网

原创

laravel 中使用自定义主键和外键定义关联关系

在 Laravel 框架中,模型关联关系是构建复杂数据结构的关键。默认情况下,Laravel 假设表的主键是 id,并且外键遵循 表名_id 的命名规范。然而,在某些情况下,我们可能需要使用自定义的主键和外键。本文将详细介绍如何在 Laravel 中定义基于自定义主键和外键的一对一关联关系,并提供代码示例和注意事项。

正如本文摘要所说,我们将学习如何在使用非默认主键和外键时,在 Laravel 中正确定义模型关联关系。

数据库迁移修改

首先,我们需要修改数据库迁移文件,以创建正确的外键约束。假设我们有两个表:students 和 accounts,它们之间存在一对一的关系,并且我们使用 nik 字段作为 students 表的主键,并在 accounts 表中存储对应的外键。

以下是一个示例迁移文件:

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

class CreateAccountsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('accounts', function (Blueprint $table) {
            $table->id();
            $table->string('username');
            $table->string('password');
            $table->string('nik')->nullable(); // 将 nik 字段设置为 nullable
            $table->timestamps();

            $table->foreign('nik')->references('nik')->on('students')->onDelete('cascade'); // 添加外键约束,并设置级联删除
        });
    }

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

class CreateStudentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('students', function (Blueprint $table) {
            $table->string('nik')->primary(); // 将 nik 字段设置为主键
            $table->string('name');
            $table->string('address');
            $table->timestamps();
        });
    }

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

注意:

淄博分类信息港程序seo特别版
淄博分类信息港程序seo特别版

seo特别版程序介绍:注意:普通用户建议使用淄博分类信息港程序普通版本。主要针对seo需要增加了自定义功能:自定义文件路径;自定义文件名;自定义关键字。这些功能的作用,只有自己体会了。以下是淄博分类信息港程序的介绍:淄博分类信息港程序一套现成的城市分类信息网站发布系统。发布管理房屋、人才、招租、招聘、求购、求租、搬迁、运输、二手交易、招生培训、婚介交友等各类信息的发布和查询。淄博分类信息港发布程序

下载
  • $table->string('nik')->primary(); 将 nik 字段设置为主键。
  • $table->string('nik')->nullable(); 在 accounts 表中将 nik 字段设置为可为空,因为可能存在尚未关联到任何学生的账户。
  • $table->foreign('nik')->references('nik')->on('students')->onDelete('cascade'); 定义了外键约束,确保 accounts 表中的 nik 字段引用 students 表中的 nik 字段。onDelete('cascade') 表示当 students 表中的记录被删除时,accounts 表中对应的记录也会被删除,以保持数据一致性。

模型关联定义

接下来,我们需要在模型中定义关联关系。

// Student Model (app/Models/Student.php)
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    use HasFactory;

    protected $primaryKey = 'nik';
    public $incrementing = false;
    protected $keyType = 'string';

    public function account()
    {
        return $this->hasOne(Account::class, 'nik', 'nik');
    }
}

// Account Model (app/Models/Account.php)
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Account extends Model
{
    use HasFactory;

    public function student()
    {
        return $this->belongsTo(Student::class, 'nik', 'nik');
    }
}

解释:

  • 在 Student 模型中,我们设置了 $primaryKey = 'nik'; 来指定 nik 字段作为主键。
  • public $incrementing = false; 由于 nik 不是自增的整数,我们需要将其设置为 false。
  • protected $keyType = 'string'; 由于主键是字符串类型,我们设置 $keyType = 'string';。
  • $this->hasOne(Account::class, 'nik', 'nik'); 在 Student 模型中,我们使用 hasOne 方法定义了一对一的关系。第一个参数是关联模型的类名,第二个参数是 Account 表中的外键,第三个参数是 Student 表中的本地键。
  • $this->belongsTo(Student::class, 'nik', 'nik'); 在 Account 模型中,我们使用 belongsTo 方法定义了反向关系。参数含义与 hasOne 相同。

使用关联关系

现在,我们可以使用定义的关联关系来访问相关数据。

// 获取学生的账户信息
$student = Student::find('student123'); // 假设 'student123' 是一个存在的 nik
$account = $student->account;

if ($account) {
    echo "Student Username: " . $account->username;
} else {
    echo "No account found for this student.";
}

// 获取账户的学生信息
$account = Account::find(1); // 假设 1 是一个存在的 account id
$student = $account->student;

if ($student) {
    echo "Account Owner Name: " . $student->name;
} else {
    echo "No student found for this account.";
}

总结

通过以上步骤,我们成功地在 Laravel 中使用自定义主键和外键定义了一对一的关联关系。 关键在于正确配置数据库迁移文件,并明确指定模型中的主键、外键以及关联关系。 请务必根据实际情况调整字段名称和表名,并确保数据库中的外键约束与模型定义保持一致,从而保证数据的完整性和关联关系的正确性。 记住要设置 $primaryKey, $incrementing 和 $keyType 属性,以确保 Laravel 正确处理非默认主键。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

319

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

276

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

370

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

371

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

81

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

64

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.08.05

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

0

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号