【问题标题】:Eloquent: Model relationship without saving to DBEloquent:模型关系而不保存到数据库
【发布时间】:2017-02-22 10:16:14
【问题描述】:

假设我有两个模型: 用户和任务

他们的关系如下: 用户可以有许多任务(belongsToMany) 任务可以有很多用户(belongsToMany)

$user = new User();
$task = new Task();

通常,我会这样做: $user->tasks->attach($task)

但问题是用户和任务没有保存在数据库中。所以如果我运行上面的最后一个代码,我会得到一个完整性约束,因为这些模型没有 id。

我查看了文档,发现有一个方法 associate() 但这需要具有 id 的模型之一(保存在数据库中)。

有什么方法可以将一个模型附加到另一个模型而无需将它们保留在数据库中?

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    我猜你可以手动调用 setRelation。

    $model->setRelation('child', $childInstance);
    

    eLSE

    您只需实例化它即可创建一个新模型:

    $model = new Model;
    

    您可以稍后将其保存到数据库中:

    $model->save();
    

    【讨论】:

    • 在做hasMany关系时传递整个集合。
    【解决方案2】:

    Laravel 中的模型只是一个普通的类。所以仅实例化它不会持久化到数据库。您应该通过保存模型来持久保存到数据库:

    这可以通过运行save() 来完成,如下所示:

    $user->save();
    $task->save();
    
    $user->tasks()->attach($task->id);
    

    请务必注意,它是 $user->tasks()->attach() 而不是 $user->tasks->attach()

    【讨论】:

    • 是的,但我不想将其保存到数据库中
    • 您正在使用 AR 实现,并且不想保存到数据库?那你想在这里实现什么?
    • 从技术上讲,我只需要集合。所以你可以想象我可以简单地创建一个数组,然后轻松地将它转换为一个集合。但是我输入提示我的类只接受“那个”模型的实例,所以我不会得到任何运行时异常......而且我认为它很聪明......
    • 为什么不将类型提示作为一个集合。您可以使用 Collection 类。
    • 可能看起来很奇怪,但我试图将责任(创建模型)从保存到数据库(我使用 Eloquent 模型作为域实体)中分离出来,并且遇到了同样的情况。 @Arun Ganessh 的回答对我帮助很大
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多