为什么分离不能立即在我的Laravel模型上工作?

时间:2015-11-19 17:03:23

标签: php mongodb laravel laravel-5 eloquent

以下是我的一些代码:

class User extends Model {

    public function orders() {
        return $this->hasMany('App\Order');
    }

    public function emptyCart() {
        $orders = $this->orders;

        foreach($orders as $order) {
            $order->user()->dissociate();
            $order->save();
        }       

        if ($this->orders) {
            echo 'Orders still exist?'
        } 
    }
}

我的回音声明正在被击中。如果我刷新我的应用程序,则没有附加订单,但是在我"空白"之后立即我的购物车,它正在退回订单,就好像我没有删除它们一样......

有趣的是,"命令"返回的模型将user_id设置为null。

1 个答案:

答案 0 :(得分:7)

$this->orders是一个关系属性。加载关系后(通过急切加载或延迟加载),除非在代码中明确完成,否则不会重新加载关系。

因此,在函数的开头,您可以访问$this->orders属性。如果订单尚未加载,则此时它们将被延迟加载。然后,您将完成并解除用户的订单。这会将user_id正确设置为null,并更新数据库(使用save()),但不会从已加载的Collection中删除项目。

如果您希望在修改关系后$this->orders属性反映关系的当前状态,则需要显式重新加载关系。示例如下:

public function emptyCart() {
    // gets the Collection of orders
    $orders = $this->orders;

    // modifies orders in the Collection, and updates the database
    foreach($orders as $order) {
        $order->user()->dissociate();
        $order->save();
    }

    // reload the relationship
    $this->load('orders');       

    // now there will be no orders
    if ($this->orders) {
        echo 'Orders still exist?'
    } 
}