以下是我的一些代码:
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。
答案 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?'
}
}