【问题标题】:Deleting all relationship then save another - just new are saved删除所有关系然后保存另一个 - 只保存新的
【发布时间】:2023-04-09 09:30:01
【问题描述】:

我有一个一对多的模型:一个明星可以有多张照片。

当我更新我的星星时,我可以添加或删除图片。当我保存星星时,我删除数据库中的所有图片,并保存新的。像这样:

$star->pictures()->delete();
$star->pictures()->saveMany($picturesAdded);

但我认为这些操作之间没有提交,因为只保存了新图片。所有已经在数据库中然后被删除的图片将不会被保存。 我认为 Eloquent 会记住它删除、插入或更新的内容,然后它会提交所有这些内容。

所以我不知道如何继续......我只是想与数据库同步。

$star->push() 能做到我想要的吗?它是删除不再存在的关系,还是只是插入/更新新关系?

如果第一个问题是真的,那该怎么做呢?

我试过了:

$star->pictures = Collection::make($picturesAdded);
$star->push();

但我有一个错误:

Unknown column 'pictures' in 'field list'

希望你能帮忙

编辑

也许可以举个例子:

我得到了带有图片的星星 [1,2,3,4]。我编辑了星星,现在我得到了 [1,2,5,6]。 如果我做我写的(集合删除然后 saveMany),我现在在我的数据库中得到 [5,6] 而我想要 [1,2,5,6]

【问题讨论】:

    标签: php laravel orm laravel-5 eloquent


    【解决方案1】:

    查看sync() 方法。 sync() 使得该关系的唯一项目是您传入的项目。语法是 $model->relationship()->sync($ids) 其中$ids 是一个 id 数组。

    因此,假设 $picturesAdded 是一个 id 数组,那么您需要做的就是

    $star->pictures()->sync($picturesAdded); 
    

    文档可以在Eloquent Relationships#Inserting Related Models中找到

    【讨论】:

    • @dramixx 在$model->relationship()->sync($ids) 中,$ids array 也可以采用[ $id1 => [ 'pivot_col' => 'pivot_val_1' ], $id2 => [ 'pivot_col' => 'pivot_val_2' ] ... ] 的形式,这将让您sync pivoted i> 数据
    • @kishanterry 我不知道。凉爽的。感谢您指出这一点。
    • 欢迎。它在您提供的文档链接中,特别是 Many To Many Relationships > Syncing For Convenience 部分
    • 确实,同步方法适用于多对多关系,但在我的情况下,这是一对多关系。我只是在我的帖子中添加一个示例以便更好地理解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多