当前位置: 首页 > 知识库问答 >
问题:

当主键是相关模型的另一列时

仉伟兆
2023-03-14

我有两个表格小部件和页面小部件

PageWidget模型:

protected $fillable = [
    'page_id',
    'widget_codes',
    'created_by',
    'updated_by',
    'deleted_by',
    'deleted_at'
];

relation in this model:

public function widgets() {
    return $this->belongsToMany(Widget::class, null, 'page_widget_ids',
        'widget_codes');

}

小部件模型:

protected $fillable = [
    'name',
    'code',
    'type',
    'page_widget_ids',
    'created_by',
    'deleted_by',
    'deleted_at'
];

存储时,我必须同步widget_代码,我使用如下方式:

$pageWidget->widgets()->sync($input['widget_codes']);

它不起作用,因为在小部件模型中,它默认主键为_id列,我想给出与代码列的关系

我在小部件模型中尝试$primaryKey='code',但我不能使用它,因为小部件模型的另一个关系使用了_id列。

共有1个答案

芮明知
2023-03-14

处理多对多关系时,您需要三个表page_widgetpage_widget_widget小部件

PageWidget模型模式应该如下所示

protected $fillable = [
    'id',
    'created_by',
    'updated_by',
    'deleted_by',
    'deleted_at'
];

小部件模型模式应该看起来像

protected $fillable = [
    'name',
    'code', //primary_key
    'type',
    'created_by',
    'deleted_by',
    'deleted_at'
];

page\u widget\u widget表应该有idpage\u widget\u idwidget\u code列。

之后,将您的关系更新到此

public function widgets() {
    return $this->belongsToMany(Widget::class, 'page_widget_widget', 'page_widget_id', 'widget_code');

}

您的同步函数现在应该可以工作了。

 类似资料:
  • 我在RSPEC中经常使用factory girl,但这个月我的任务是在测试套件中实现Cucumber故事。我想我可能有个不太确定的问题。 我们的“主”账户模型称为“公司”。用户、员工等属于此。有些直接通过f/k其他人通过委托。我们使用工厂女孩的旧方法设置了许多使用工厂女孩构建的模型实例变量。 i、 e in’spec\u助手。rb' 这在我看来相当愚蠢。 当我试图用“属性已定义:关联”的适当关联来

  • 问题内容: 同一列可以对另一列具有主键和外键约束吗? 如果我尝试删除table1数据,这会成为问题吗? 谢谢。 问题答案: 这应该没有问题。考虑以下示例: 这些表现在包含: 现在我们可以成功删除这样的行: 但是,我们将无法删除以下内容: 如果我们使用选项定义了外键,那么我们将能够删除父项,并且所有子项都将被自动删除: 如果我们要重复之前失败的操作,则将删除其中的子行以及其中的父行:

  • 问题内容: 我有这段代码: 当我运行该代码时,出现以下错误: TypeError:无法散列的类型:’dict’ 该错误的原因是什么,我该怎么解决? 问题答案: 从错误中,我推断这是一个字典(请参阅下面的repro)。字典不能被散列,因此不能用作另一个字典的键(或本身就是这个键!)。 您可能意思是或。如果这两种解决方案都不起作用,那么在有关什么类型和是什么以及它们包含什么的更多上下文中,我们将能够为

  • 如何修复错误... 更新记录显示此错误时: 显示错误:{“附加“DomainClass.WorkshopReport”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到生成的数据库关键值。在这种情况下,请使

  • 错误: 其他信息:附加“实体”类型的实体失败。客户”,因为另一个相同类型的实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则使用“附加”方法或将实体的状态设置为“未更改”或“修改”时可能会发生这种情况。这可能是因为某些实体是新的并且没有收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体来跟踪图,然后根据需要将非新实体的状态设置为“未更改”或“修改”。 我的代码: 我是这

  • 问题内容: 我有这段代码: 当我运行该代码时,出现以下错误: TypeError:无法散列的类型:’dict’ 该错误的原因是什么,我该怎么办才能解决? 问题答案: 从错误中,我推断出它是字典(请参阅下面的repro)。字典不能被散列,因此不能用作另一个字典的键(或本身就是该键!)。 您可能意思是或。如果这两种解决方案都不起作用,则可以通过更多上下文了解什么是类型以及它们包含什么,我们将能够为您提