2015-11-19 70 views
1

下面是我的一些代碼:爲什麼分離不能立即在我的Laravel模型上工作?

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?' 
     } 
    } 
} 

我的echo語句被擊中。如果我刷新我的應用程序,沒有附加任何訂單,但在我「清空」我的購物車後立即返回訂單,就好像我沒有移除它們一樣......

有趣的是,「訂單」返回有user_id設置爲空。

+0

我不知道laravel可言,但是從語法猜測應該不會是'$此 - > $命令 - >分離()'? –

回答

6

$this->orders是關係屬性。一旦關係加載(通過預加載或延遲加載),除非在代碼中明確完成,否則關係將不會被重載。

因此,在您的功能開始時,您可以訪問$this->orders屬性。如果訂單尚未加載,則此時它們將被延遲加載。然後,您會瀏覽並分離用戶的訂單。這正確地將user_id設置爲空,並更新數據庫(使用您的save()),但它不會從已加載的集合中刪除項目。

如果您希望$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?' 
    } 
} 
+0

太棒了!我無法在文檔中找到它,或者我正在尋找錯誤的地方。謝謝。 – Rail24

+0

@ Rail24我不認爲它是在文檔中特別提到的。快速搜索後我找不到它。其中一件事是你一路學習的。潛入源代碼可以真正幫助弄清楚這些事情是如何工作的。當你只是想完成某些事情時不可行,但也許當你有一些停機時間並感興趣時。 – patricus

相關問題