Laravel 5.8 在数据透视表上保存一对多关系

Posted

技术标签:

【中文标题】Laravel 5.8 在数据透视表上保存一对多关系【英文标题】:Laravel 5.8 saving one to many relation on pivot table 【发布时间】:2019-11-30 04:50:44 【问题描述】:

我与数据透视表有多对多关系。在这个数据透视表中,我有 2 个一对多关系。它看起来像这样画出来的:

在代码中是这样的:

WorkflowStep 模型:

public function workflowinstances(): BelongsToMany

    return $this->belongsToMany(WorkflowInstance::class)
        ->using(WorkflowInstanceWorkflowStep::class)
        ->withPivot([
            'started_at',
            'finished_at',
            'failed_at',
            'output',
        ])
        ->withTimestamps();

工作流实例模型:

public function workflowSteps(): BelongsToMany

    return $this->belongsToMany(WorkflowStep::class)
        ->using(WorkflowInstanceWorkflowStep::class)
        ->withPivot([
            'started_at',
            'finished_at',
            'failed_at',
            'output',
        ])
        ->withTimestamps();


WorkflowInstanceWorkflowStep Pivot 模型:

public function sourceFile(): BelongsTo

    return $this->belongsTo(File::class, 'source_file_id', 'id');


public function destinationFile(): BelongsTo

    return $this->belongsTo(File::class, 'destination_file_id', 'id');

文件模型:

public function workflowInstanceStepSources(): HasMany

    return $this->hasMany(WorkflowInstanceWorkflowStep::class, 'source_file_id', 'id');


public function workflowInstanceStepDestinations(): HasMany

    return $this->hasMany(WorkflowInstanceWorkflowStep::class, 'destination_file_id', 'id');

现在我的目标是保存文件 - 透视关系,但这似乎不起作用:

$fileObject = $workflowStep->entity->sourceClient->files()->create([
    'name' => $filename,
    'extension' => $file['extension'],
    'category' => 'transfer',
    'original_file_id' => 1,
    'path' => $filePath,
    'link_id' => 1,
]);

$fileObject->workflowInstanceStepSources()->save();

我创建了一个新的 File 对象,然后我想用我的关系将它链接到数据透视表

我在这里尝试的可能吗?

编辑完整的数据库方案

【问题讨论】:

能否在save 周围添加代码以了解上下文? @Shizzen83 我编辑了原帖 不是答案而是问题,你是如何生成如此漂亮的图表的? @Shobi drawsql.app :) 【参考方案1】:

如果您的目标是保存模型及其关系,请尝试使用 push 方法而不是 save,它会递归保存。

$fileObject->push();

【讨论】:

我不应该定义我想要推送的内容吗? 我看不到你的 entitysourceClient 实现。 entity 看起来像一个多态关系,但我没有看到任何关于 sourceClient 的信息。

以上是关于Laravel 5.8 在数据透视表上保存一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 多列上的多对多同步()

laravel:更新或创建(更新插入)数据透视表

Laravel - 将其他列值保存到数据透视表

Laravel 数据透视表获取值并传递给刀片模板

如何在 Laravel 中从多对多关系的一对多关系中获取项目?

在 laravel 5.8 中导入 excel 文件后无法管理文件数据