2016-06-07 25 views
0

我在數據庫中有一個user_addresses表來存儲用戶的地址。由於用戶可以存儲很多地址,但只有其中一個地址是Primary of Default Address。要將地址設置爲Primary Address,表格的列號爲default_flag,即1 if primary else 0 for non primaryCakePHP 3:更新數據庫中的單個字段而不是表格

現在由於用戶只能有一個主地址,他可以隨時更改。爲此,我列出了所有地址,其中default_flag != 1及其旁邊的按鈕將其設置爲primary address。當用戶點擊該按鈕時,地址被設置爲主要地址,並且之前的主要地址default_flag被設置爲0

我試過這樣做。

我創建了一個postButton,其中兩個密鑰傳遞給updatePrimaryAddress動作,一個是要設置爲主要地址的地址,而另一個是已經是主要地址的地址的ID。

<?= $this->Form->postButton(__('Choose'), ['controller' => 'UserAddresses', 'action' => 'updatePrimaryAddress', $nonPrimaryAddress->id, $primaryAddressId], ['class' => 'btn btn-success pull-left']) ?> 

UserAddressesController

<?php 
namespace App\Controller; 

use App\Controller\AppController; 
use Cake\ORM\TableRegistry; 

/** 
* UserAddresses Controller 
* 
* @property \App\Model\Table\UserAddressesTable $UserAddresses 
*/ 
class UserAddressesController extends AppController 
{ 
    public function updatePrimaryAddress($id = null, $primaryAddress = null) 
    { 
     $userAddresses = TableRegistry::get('UserAddresses'); 
     $primaryAddress = $userAddresses->get($primaryAddress); 
     $primaryAddress->default_flag = 0; 
     $userAddresses->save($primaryAddress); 
     $address = $userAddresses->get($id); 
     $address->default_flag = 1; 
     $userAddresses->save($address); 

     return $this->redirect($this->referer()); 
    } 
} 

在按鈕的點擊,頁面重新加載,但在數據庫中沒有數據更改。

+1

FIrst:您使用發佈按鈕,但您從未讀取控制器中的發佈數據。我的建議:使用簡單的鏈接,而不是一個帖子按鈕。第二:我不確定你的邏輯是否一致:$ address和$ primaryAddress實際上是同一個實體,因爲它們都來自$ id。第三我會做一些關於用戶更改地址的檢查,因爲現在任何用戶都可以更改其他人的默認地址 – arilia

+0

讓它工作...更新我的問題與工作代碼。並感謝您糾正錯誤。 –

+0

您仍然在使用發佈按鈕,沒有任何理由,並且您還有安全問題,因爲任何人都可以通過訪問網址輕鬆更改其他用戶的默認地址。另外,用戶可以將多個地址設置爲默認地址。 – arilia

回答

1

爲什麼在你沒有讀取動作中的數據時使用postButton?

你可以使用一個簡單的鏈接:

$this->Html->link(__('Choose'), [ 
    'controller' => 'UserAddresses', 
    'action' => 'updatePrimaryAddress', 
    $nonPrimaryAddress->id, // you don't need this 
    $primaryAddressId 
], 
['class' => 'btn btn-success pull-left'] 
); 

但是,你甚至不需要發送關於舊地址的信息,你已經在你的數據庫中。

public function updatePrimaryAddress($address_id) 
{ 
    // I suppose you have authenticated you user 
    // so let's retrieve his id 

    $user_id = $this->Auth->User('id') 

    // now I set the address as default 
    // but only if it belongs to that user 
    $rows_affected = $this->userAddresses->UpdateAll(
     ['default_flag' => 1], 
     [ 
      'user_id' => $user_id, 
      'id' => $address_id 
     ]); 

    // now I set all the other addresses as not default 
    // but only if I have successfully changed the default address 
    // and just for that one user 
    if($rows_affected > 0) 
    { 
     $this->userAddresses->UpdateAll(
     ['default_flag' => 0], 
     [ 
      'user_id' => $user_id, 
      'id !=' => $address_id 
     ]); 
    } 
    else 
    { 
     $this->Flash->warning("Seems you're trying to switch to a non existing address or to change other's user address"); 
    } 
    return $this->redirect($this->referer()); 
} 
+0

謝謝arilia。 +1 –

相關問題