首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不同型号使用相同文件表的Laravel关系

不同型号使用相同文件表的Laravel关系
EN

Stack Overflow用户
提问于 2018-11-08 06:55:16
回答 2查看 1.9K关注 0票数 0

我创建了一个files表来存储文件的元数据以及查找该文件的本地路径。

我想用这张桌子,用于多种型号。

例如,users可以在此表中存储配置文件图片。但是companies可以将他们的徽标存储在这个表中。所以实际上,我所有可以存储文件的模型都与这个表有关系。

因此,在userscompanies中,我创建了一个列file_id,它引用了files表上的id。因为files表可以存储多个模型的文件,所以我不会在“files表”中存储user_idcompany_id

现在的问题是,如何将这种关系添加到userscompanies表中?因为据我所见,它要求files表具有userscompanies的id。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-08 07:00:22

这看起来像一个多态关系。从文件中:

多态关系 表结构 多态关系允许一个模型在单个关联上属于多个其他模型。例如,想象一下您的应用程序的用户可以在帖子和视频上“评论”。使用多态关系,您可以为这两种情况使用一个comments表。首先,让我们检查构建这种关系所需的表结构: 张贴id -整数标题-字符串正文-文本视频id -整型标题-字符串url -字符串注释id -整数体-文本commentable_id -整数commentable_type -字符串 需要注意的两个重要列是commentable_id表中的comments列和comments表上的commentable_type列。commentable_id列将包含post或视频的ID值,而commentable_type列将包含所属模型的类名。commentable_type列是ORM在访问commentable关系时如何确定要返回的拥有模型的“类型”。 模型结构 接下来,让我们研究构建这种关系所需的模型定义: 使用照明\数据库\雄辩\模型;类注释扩展模型{ /** *获取所有拥有的可评论模型。*/ public函数式评论员(){传回$this->morphTo();} class Post扩展Model { /** *获取该帖子的所有注释。*/公共函数注释(){返回$this->变形Model (‘App\注释’,‘评论性’);}类视频扩展模型{ /** *获取所有视频评论。*/公共函数注释(){返回$this->变形this(‘App\注释’,‘评论性’);}

因此,在您的示例中,您的文件表结构可能如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
files
    id - integer
    url - string
    fileable_id - integer // <--- the id of the object
    fileable_type - string // <-- the type of the object (user, company, etc)

那么在你们的模特中:

File.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class File extends Model
{
    /**
     * Get all of the owning fileable models.
     */
    public function fileable()
    {
        return $this->morphTo();
    }
}

User.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class User extends Model
{
    /**
     * Get all of the user's files.
     */
    public function files()
    {
        return $this->morphMany(File::class, 'fileable');
        // or
        // return $this->morphOne(File::class, 'fileable'); equivalent to hasOne
    }
}

Company.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Company extends Model
{
    /**
     * Get all of the company's files.
     */
    public function files()
    {
        return $this->morphMany(File::class, 'fileable');
        // or
        // return $this->morphOne(File::class, 'fileable'); equivalent to hasOne
    }
}
票数 2
EN

Stack Overflow用户

发布于 2018-11-08 07:24:23

你走的方向是对的。

您可以在您的users表中使用companiesfiles外键。

在Laravel 5多态关系中。

https://laravel.com/docs/5.7/eloquent-relationships#polymorphic-relations

您可以拥有外键fileable_id和外键fileable_type的类型。

如果要为companies记录添加一个文件

假设您的公司id为24,您正在使用的模型是App\Models\Company

将以下内容添加到文件模型App\File

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function fileableable()
{
    return $this->morphTo();
}

然后跟着你的App\UserApp\Company

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public function files()
{
    return $this->morphMany('App\Comment', 'fileable'); // use morphOne if you want One to One relation
}

若要为公司创建文件,请执行以下操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$company = Company::find(24);
$company->files()->create([
   'path' => '/folder/myfile.txt',
   'size' => '14585',
   'extension' => 'txt',
]);

在这个阶段,您可能会得到MassAssignmentException

在您的App\File模型中

添加$fillable = ['path', 'size' , 'extension'];

你的记录看起来如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
id   path                size   extension     fileable_id    fileable_type

1  /folder/myfile.txt   14585   txt           24              App\Models\Company

Laravel通过调用关系方法的对象自动存储fileable_idfileable_type。你不用手动把这些

提示:总是要通过官方文档

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53210266

复制
相关文章
Android获得控件在屏幕中的绝对坐标
计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标
他叫自己MR.张
2019/07/01
2.1K0
绑定事件中 如可控制函数的执行次数
var flag = true; function onlyOne() { if(flag) { "这里是要执行的代码"; } flag = false//该方法是控制函数仅执行一次 因为flag是全局变量 onlyOne()函数执行一次后flag就变成false了 函数就执行不了了
大当家
2018/06/28
2.3K0
关于webform中控件的列表数据的绑定
1、使用这些控件的方法主要是以下步骤;
静心物语313
2020/03/24
1.9K0
关于webform中控件的列表数据的绑定
VC如何获取对话框中控件的坐标
VC如何获取对话框中控件的坐标 GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。 GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,它的top和left都为0,right和botton是宽和高,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。   ClientToScreen把客户区坐标系下的RECT坐标转换为屏
_gongluck
2018/03/08
2.6K0
WPF Image控件的绑定
在我们平时的开发中会经常用到Image控件,通过设置Image控件的Source属性,我们可以加载图片,设置Image的source属性时可以使用相对路径也可以使用绝对路径,一般情况下建议使用绝对路径,类似于下面的形式Source="/Demo;Component/Images/Test.jpg"其中Demo表示工程的名称,后面表示具体哪个文件夹下面的哪个图片资源,在程序中,我们甚至可以为Image控件设置X:Name属性,在后台代码中动态去改变Image的Source,但我个人认为这种方式不太适合最大量的图片切换,而且增加了View层和代码之间的耦合性,不是和复合MVVM的核心设计思想,所以今天就总结一下Image的动态绑定的形式。
hbbliyong
2019/10/24
1.8K0
dropdownlist控件绑定_dropdownlist控件联动
也谈谈动态绑定dropdownlist CSDN 2004年7月31日 <script src=”http://www.jaron.cn/cms-server/ArticleViewTim
全栈程序员站长
2022/11/08
1.4K0
Fabric.js 拖拽顶点修改多边形形状
其实 Fabric.js 官网也有这个demo:Fabric.js demos · Custom controls, polygon 。但这个demo可能对于刚接触 Fabric.js 的工友来说有点过于复杂,所以本文就把该demo进一步简化,简化到老奶奶也能看得懂的!
德育处主任
2023/05/11
2K0
Fabric.js 拖拽顶点修改多边形形状
【Android UI】Canvas 画布 ⑤ ( Canvas 坐标系 | Canvas 绘图坐标系变换示例 )
Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ;
韩曙亮
2023/03/30
1.4K0
【Android UI】Canvas 画布 ⑤ ( Canvas 坐标系 | Canvas 绘图坐标系变换示例 )
坐标拾取系统定位_cad移动到绝对坐标
public GameObject[] cameras;//移动camera物体
全栈程序员站长
2022/09/21
3670
Qml获取某个控件的全局坐标
  点击详情(detail)按钮调出菜单列表。菜单栏的位置需要定位详情按钮的下面,那么就需要知道具体坐标。
Qt君
2023/03/17
2.8K0
Qml获取某个控件的全局坐标
winfrom如何在listview中添加控件
private Button btn = new Button(); private void Form1_Load(object sender, EventArgs e) { ListViewItem[] lvs = new ListViewItem[3]; lvs[0] = new ListViewItem(new string[] { "行1列1", "行1列2", "" }); l
码农阿宇
2018/04/18
2.6K0
如何在 Matlab 中绘制带箭头的坐标系
方法二:使用 Matlab 自带的一个图窗标注函数 annotation,具体用法请点击查看文档,简而言之,该函数可以在图窗指定位置绘制图形(箭头,矩形,椭圆等)或文字。其中绘制箭头的调用格式为
iam002
2021/08/18
8.4K0
如何在 Matlab 中绘制带箭头的坐标系
canvas清除画布-ZBrush中如何清除画布中多余图像
  ZBrush是一款数字雕刻与绘画软件,它以强大的功能和直观的工作流程彻底改变了整个三维行业。它的简洁化、智能化和人性化的设计无不让众多用户所折服。刚接触它的用户可能会因为找不到相关命令或不熟悉而觉得它有些复杂canvas清除画布,那么,在ZBrush®软件中如何对多余模型进行清除的操作有些刚接触的用户会找不清,本文就删除画布中的多余模型做详细讲解。
宜轩
2022/12/29
2.5K0
【Android UI】Canvas 画布 ④ ( Canvas 坐标系 | Canvas 自身坐标系 | Canvas 绘图坐标系 )
Canvas 状态保存机制 中 , 存在两个栈结构 , 分别是 状态栈 和 图层栈 ;
韩曙亮
2023/03/30
1.6K0
如何在控件的设计时得到窗体设计器中的所有控件
本文转载:http://www.cnblogs.com/Ricky81317/archive/2007/01/04/611942.html
跟着阿笨一起玩NET
2018/09/18
1.2K0
win10 uwp 获得元素绝对坐标
有时候需要获得一个元素,相对窗口的坐标,在修改他的位置可以使用。 那么 UWP 如何获得元素坐标? 我提供了一个方法,可以获得元素的坐标。
林德熙
2018/09/18
8650
win10 uwp 获得元素绝对坐标
软件测试|超好用超简单的Python GUI库——tkinter(十四)
我们知道我们可以使用pillow绘制不同形状的图形,但是我们能不能使用tkinter实现这个功能呢,当然可以,tkinter也可以实现图形的绘制,并且可以将绘制的图形添加到我们的GUI中。
霍格沃兹测试开发Muller老师
2023/06/02
9190
使用Word将图片裁剪成各种不同形状,如圆形。
1、点击[插入] 2、点击[形状] 3、点击[椭圆] 4、点击[文本] 5、按<Shift>键 6、点击[格式] 7、点击[形状填充] 8、点击[图片] 9、点击[来自文件] 10、点击[早餐优惠券图片] 11、点击[1.jpg] 12、点击[插入]
裴来凡
2022/05/28
1.9K0
使用Word将图片裁剪成各种不同形状,如圆形。
点击加载更多

相似问题

检查X509证书吊销

10

吊销客户端X509证书

31

证书吊销列表

22

如何生成CRL (证书吊销列表)文件

10

如何通过DSS获取X509证书吊销状态?

110
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文