Laravel-多对一多态关系

2024-02-29

我正在使用 Laravel 5.1。场景如下(此为示例,真实场景与此示例类似)

我有3个型号

  1. 大学
  2. 学生
  3. Teacher

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

一所学院可以有多名教师,但一名教师只能属于一所学院。

我想在 laravel 中建立这些表之间的关系。 实现此目的的方法之一是放置一个学院_id学生和教师表上的外键。但就我而言,这个外键很多时候都会为空。因此,我不想在 3-4 个表中使用大部分为空值的单独列,而是想探索为 College 表建立多态关系的选项。

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

http://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations 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);

但是,当我尝试使用下面指定的学生模型实例检索大学模型实例时,它给了我一个错误:-

public function index()
    {
        return \App\Student::find(1)->college;
    }

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

这是预料之中的,因为 morphOne 与表中的列一起工作,我想。 如果我将学生模型中的 morphOne 函数更改为 morphToMany,代码就会开始工作,并且我也能够检索值。但这使得这种关系成为多对多,这又不是我想要的。

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

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


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

colleges
    id
    name

teachers
    id
    name
    college_id

students
    id
    name
    college_id

然后你的模型可以使用belongsTo() and 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 风格的网站。有客户和项目,您想对两者发表评论。在这种情况下,您将使注释成为多态关系,因为注释属于单个客户或单个项目,但不能同时属于两者。

你们的关系恰恰相反。就您而言,学生和教师属于一所大学。如果您遵循前面示例的模式,那么一所大学将属于单个学生或老师。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel-多对一多态关系 的相关文章

  • PHP:是否可以从文件内容(字符串)创建 SplFileObject 对象?

    例如 contents file get contents image png 是否可以从 contents 创建 SplFileObject 对象 Thanks php 有一些特殊的流包装器 http www php net manual
  • Php mysql 30秒后执行任务

    如何让 mysql 查询命令在访问 php 站点 30 秒后执行 您可以对执行 mysql 查询的 php 脚本发出 AJAX 请求 在 js 中使用计时器
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • 由于重复捕获组而不是捕获重复组,正则表达式不匹配

    我有以下正则表达式 A G A G 具有以下表达式 A BsCb 我期望 3 个匹配结果 A Bs Cb 但测试在https regex101 com https regex101 com 只给我最后一场比赛Cb 并告诉我重复捕获组只会捕获
  • 未找到“MongoId”类(带有 MongoDB Doctrine 的 Zend 框架)

    我目前正在尝试将 MongoDB 与 ZendFramework 中的 Doctrine 集成 我做了很多教程 在 StackOverflow 或其他地方 但没有任何效果 我一步步按照教程进行操作 http www bigwisu com
  • 如何使用 PHP 查找目录中的前 5 个文件?

    如何使用 PHP 列出按字母顺序排序的目录中的前 5 个文件或目录 Using scandir array slice array filter scandir path to dir is file 0 5 The array filte
  • PHP语言问题

    我有一个 php 页面 它将邮件发送到特定电子邮件 其中包含此页面表单中的数据 邮件必须以网站的母语 阿拉伯语 发送 但是当我单击表单上的提交按钮时 收到的邮件一半可读 阿拉伯语 另一部分不可读 符号 我想知道如何解决这个问题并且能够发送邮
  • Symfony 学说错误“DoctrineMigrationsBundle 需要启用 DoctrineBundle。”

    我创建了一个新的 Symfony 项目 并且不断收到此消息 DoctrineMigrationsBundle 需要启用 DoctrineBundle 错误并且无法摆脱它 显然我是这个星球上唯一一个收到此错误的人 因为谷歌并没有太大帮助 在
  • ajax 会增加还是降低安全性?

    我正在创建一个网站 到目前为止它是纯 PHP 的 我在想 既然很少有人没有启用 JavaScript 我想知道为什么 也许我应该将我的网站创建为一个完全 PHP 的网站 而不使用任何 AJAX 难道是我想错了 可以肯定的是 如果我实施一些
  • 如何在 Laravel Mix 中将公共路径更改为包含下划线的路径?

    Laravel 5 4 中引入了 Mix 来编译资产并维护资产管道 Mix 默认为您的公共目录被命名public 在许多情况下 包括我的 我的公共目录被称为其他名称 就我而言 是public html 如何更改资源编译到的公共目录 我尝试过
  • PHP,文本从数据库中回显,没有换行,全部一体

    我的数据库中有一个长文本 从 php mayadmin 来看它看起来很好 但是当我将它回显到页面时 它会丢失所有格式 即没有新行 全部都在一个块中 有任何想法吗 Thanks 可能是因为换行符是 n 并且 html 想要 br 所以使用nl
  • Mongodb $push 嵌套数组

    我想向我的嵌套数组添加新数据 我的文档是 username erkin email email protected cdn cgi l email protection password b playlists id 58 name asd
  • 如何在PHP中将图像从内存上传到AWS S3?

    所以我目前有一个使用 AWS S3 上传图像的上传系统 这是代码 Upload image to S3 s3 Aws S3 S3Client factory array key gt mykey secret gt myskey try s
  • 如何让Symfony2直接加载CSS、JS文件而不是通过PHP?

    老问题 请参阅下面的更新版本 我的开发环境不是最快的 每个 PHP 请求大约需要 500 毫秒 它开始成为 Symfony2 资源文件的问题 因为每个资源文件都是通过 Symfony 的内部控制器请求的 http localhost myp
  • PHP URL 验证

    我知道有无数的线程问这个问题 但我一直无法找到一个可以帮助我解决这个问题的线程 我基本上试图解析大约 10 000 000 个 URL 的列表 确保它们根据以下标准有效 然后获取根域 URL 此列表包含您能想象到的几乎所有内容 包括类似的内
  • 使用 Flot、html、PHP 和 MySql 查询绘制多个图表

    我正在尝试使用 Flot html PHP 和 MySql 查询绘制多个图表 但我陷入了困境 因为我找不到在同一个 html 页面中绘制多个 flot 的方法 为简单起见 在数据库 test db3 映像中包含以下字段 表1 用户名 发送邮
  • WooCommerce 自定义产品类型选项不隐藏自定义产品选项卡

    我刚刚向我的 WC 管理产品页面添加了自定义产品类型选项 add filter product type options this filter product type options 99 1 public function filte
  • 如何编写可以补偿拼写错误数据的 MySQL 搜索?

    有没有什么方法可以编写一个 MySQL 搜索来弥补用户在拼写等方面的错误 作为随机示例 有人可能会输入 电子邮件受保护 cdn cgi l email protection代替 电子邮件受保护 cdn cgi l email protect
  • 将价格格式设置为逗号分隔

    在我的数据库中 我有类似的值 256 23 200 33 89 33 133 45 我必须将这些值乘以千 然后将结果格式化为价格 逗号分隔 256 23 x 1000 256230 I want to show this as 256 23
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C

随机推荐

  • Visual Studio 2005 清洁解决方案[重复]

    这个问题在这里已经有答案了 如果我有一个包含 10 个项目的解决方案 当我单击 清理解决方案 时 是否只是清理主启动项目解决方案中的 bin debug 或每个项目目录中的 bin debug 它针对当前选定的配置 例如调试 发布等 清理解
  • 在 ng2-select2 中使用 AJAX

    我的 angular2js 项目中有很多下拉菜单 我在用ng2 选择2 https github com NejcZdovc ng2 select2对于这些下拉菜单 在某些下拉列表中 我需要根据用户在 select2 搜索框中输入的字符串来
  • OpenAPI 规范 (YML/YAML):所有 $refs 替换或扩展为其定义(带有模式验证)

    我正在寻找一些解决方案或者一些脚本 可以帮助我通过模式验证替换 ref 或扩展其在 YML 文件中的定义 具体请看下面的例子 示例 使用 ref 输入 pets petId get summary Info for a specific p
  • 识别UIWebview的提交按钮点击

    我有一个带有多个按钮的 UIWebView 页面 需要识别点击的是哪个按钮UIWebView UIWebview加载内容的页面源码
  • 如何获取图片资源

    我应该如何获取imageButton的当前图像资源 我需要这样的东西 imageButton getImageResource 多谢 我认为你不能 当前的 API 不允许这样做 但如果你真的需要这个 你可以这样做 imageButton s
  • 为锦标赛系统分配奖品

    我正在寻找一种将数字分布到 x 个单位的方法 我什至不知道如何表达这个词 所以我举个例子 有一场锦标赛 总奖金为 1000 美元 我希望前 20 名获胜者 参赛者能够从中赢得一些东西 我需要一个数学算法 公式 将其分配给这些玩家 并让我有能
  • 在 Spring Boot 的 application.properties 中使用 env 变量

    我们正在开发一个Spring Boot Web应用程序 我们使用的数据库是MySQL 我们的设置是我们首先测试它locally 意味着我们需要在我们的PC上安装MySQL 然后我们推送到 Bitbucket Jenkins 自动检测到 Bi
  • 如何使 str.splitlines 方法不按十六进制字符分割行?

    我正在尝试使用 str splitlines 解析 GNU Strings 实用程序的输出 这是 GNU Strings 的原始输出 279304 9k pN n 279340 9k PN n 279376 9k
  • Go 语言的 Setter

    抱歉问这个基本问题 我是 Go 语言的新手 我有一个名为的自定义类型ProtectedCustomType我不希望其中的变量是set直接由调用者调用 而想要一个Getter Setter方法来做到这一点 下面是我的ProtectedCust
  • 获得正确的方法来设计复选框,而无需跟随标签标签

    我使用一些 CSS 来重新设计 ASP NET 中的复选框 input type checkbox display none important cursor pointer input type checkbox not disabled
  • 单元测试 REST API

    我在单元测试和模拟方面有一些经验 在我有限的经验中 我会使用这两者来测试服务层 例如 模拟 存根 数据库以消除依赖性并集中于对业务逻辑进行单元测试 现在 我正在创建一个将使用 RESTful Web 服务的包装 API 实现 发回给我的js
  • 如何在 Google Play 中切换语言? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在对 Google Play 进
  • 为什么在单元测试中在$compile(element)(scope)之后调用scope.$digest()

    以下是用于测试指令的非常常见的通用场景 var element scope beforeEach inject function rootScope compile scope rootScope new element angular e
  • Javascript 舍入 v C# 舍入

    我在 ASP NET MVC 中有一个发票页面 我正在计算商品及服务税 在 javascript 中 这是结果 165 45 0 1 16 544999999999998 在 C 中我得到 165 45 0 1 16 545 这些轮次不同
  • 比较两个日期Google Apps脚本

    最好的方法是什么比较两个日期 var int e parameter intlistbox var startDate rSheet getRange parseInt int 1 1 getValues returns Sat Jun 3
  • 如何在浏览器中配置 webpack -libraryTarget + splitChunks + require

    我正在用 JS 为网页编写库 并通过 Webpack 编译 它 我需要在单独的 Webpack 项目中的页面上导入 需要 如 requirejs 这些库 库可以托管在两个单独的路径上 一个是相对路径 第二个是绝对路径 我如何配置 webpa
  • 未找到与模式匹配的测试程序集 - Visual Studio 测试 - VSTS

    这个问题类似于 VSTS 测试组件 未找到测试组件 https stackoverflow com questions 47288399 vsts test assemblies no test assemblies found 当时似乎已
  • 如何转换音频以便可以跨设备传输

    我已经寻找这个问题的答案大约一个月了 所以非常感谢您的帮助 我正在使用 AVAudioEngine 来录制音频 该音频是使用水龙头录制的 localInput installTap onBus 0 bufferSize 4096 forma
  • Postgres 获取具有逗号分隔值的列表

    我正在使用 Postgres SQL 并具有以下连接查询 当我执行此查询时 我会为每个员工获得两到 3 条记录 因为每个员工有 3 种不同类型的电子邮件地址 1 家庭地址 2 办公室地址 3 社交地址 select from root em
  • Laravel-多对一多态关系

    我正在使用 Laravel 5 1 场景如下 此为示例 真实场景与此示例类似 我有3个型号 大学 学生 Teacher 一所学院可以有很多学生 但一个学生只能属于一所学院 一所学院可以有多名教师 但一名教师只能属于一所学院 我想在 lara