gpt4 book ai didi

php - Laravel-多对一的多态关系

转载 作者:行者123 更新时间:2023-12-03 19:10:17 24 4
gpt4 key购买 nike

我正在使用 Laravel 5.1。场景如下(这是一个例子,真实场景和这个例子类似)

我有3个模型

  • 学院
  • 学生
  • 老师

  • 一个学院可以有很多学生,但一个学生只能属于一个学院。

    一个学院可以有很多老师,但一个老师只能属于一个学院。

    我想在 Laravel 中建立这些表之间的关系。
    一种方法是在学生和教师表上放置一个 College_id 外键。但在我的情况下,这个外键很多次都是空的。因此,我不想在 3-4 个表中使用大部分为空值的单独列,而是想探索为 College 表设置多态关系的选项。

    这是我试过的:
    laravel 文档(下面的链接)中给出的示例描述了一对多关系,而我的场景更像是多对一关系。

    http://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations

    如示例中所示,College 表中的 Collegeable_id 和 Collegeable_type 列无法满足我的要求,因为大学可以包含许多学生/教师,因此我创建了一个数据透视表:
    Schema::create('collegeables', function (Blueprint $table) {
    $table->integer('college_id')->unsigned();
    $table->integer('collegeable_id')->unsigned();
    $table->string('collegeable_type');
    });

    我有以下型号

    学院模式:
        namespace App;

    use Illuminate\Database\Eloquent\Model;

    class College extends Model
    {
    public function students()
    {
    return $this->morphedByMany('App\Student', 'collegeable');
    }
    }

    学生模型:
        namespace App;

    use Illuminate\Database\Eloquent\Model;

    class Student extends Model
    {
    public function college()
    {
    return $this->morphOne('App\Colleges', 'collegeable');
    }
    }

    通过这种安排,我可以使用像这样的 College 模型实例来存储学生
    $college = \App\College::find(1);
    $student = new \App\Student;
    $student->name = 'John Doe';
    $college->students()->save($student);

    但是,当我尝试使用下面指定的学生模型实例检索 College 模型实例时,它给了我一个错误:-
    public function index()
    {
    return \App\Student::find(1)->college;
    }

    SQLSTATE[42S22]:未找到列:1054 未知列“colleges.collegeable_id”

    这是一种预期,因为 morphOne 与我想的表中的列一起使用。
    如果我将学生模型中的 morphOne 函数更改为 morphToMany,则代码开始工作,我也可以检索值。但这使这种关系成为多对多,这又不是我想要的。

    所以我的问题是:-
    他们是我可以在学生模型中使用的 morphSomething 函数,以便能够在保持一对多关系的同时检索学生大学的值吗?


    任何帮助将非常感激。谢谢。

    最佳答案

    没有理由在这里使用多态关系。相反,只需将外键添加到您的 colleges您的 table 上studentsteachers表。像这样:

    colleges
    id
    name

    teachers
    id
    name
    college_id

    students
    id
    name
    college_id

    然后您的模型可以使用 belongsTo()hasMany()关系,像这样:
    class College extends Model {
    public function students() {
    return $this->hasMany(App\Student::class);
    }

    public function teachers() {
    return $this->hasMany(App\Teacher::class);
    }
    }

    class Teacher extends Model {
    public function colleges() {
    return $this->belongsTo(App\College::class);
    }
    }

    class Student extends Model {
    public function colleges() {
    return $this->belongsTo(App\College::class);
    }
    }

    多态一对多关系与这种关系相反,在这种关系中,您的模型只能与单个记录相关,但该记录可以是许多不同的模型。

    编辑:为了进一步解释为什么这里不需要多态关系,让我们看看哪里需要它。假设您有一个简单的 CRM 风格的网站。有客户和项目,您希望对两者都有评论。在这种情况下,您可以使 Comments 成为多态关系,因为 Comments 属于单个 Customer 或单个 Project,但不属于两者。

    你们的关系恰恰相反。在您的情况下,学生和教师属于一所大学。如果您遵循上一个示例的模式,则一所大学将属于单个学生或教师。

    关于php - Laravel-多对一的多态关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33370264/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com