2011-04-04 24 views
1

CakePHP中考慮這樣的代碼:CakePHP的設置從模型空變量眼簾的更有效的方式

$query = $this->find('first'...); 

產生此陣:如果我的觀點一樣,使用城市名稱

[UserAddress] => Array 
    (
     [address_name] => Abc 55 Avenue 
     [address_id] => 6 
     [country_id] => 9 
     [city_id] => 35 
     [Country] => Array 
      (
       [country_name] => 'China' 
      ) 
    [City] => Array 
     (
      [city_name] => Null 
     ) 
) 

$this->set('data', $query); 

現在:

echo $this->data['UserAddress']['City']['city_name']; 

因爲沒有設置city_name,所以我會收到「通知」。任何人都可以提出更有效的方式來設置「未設置」變量「」(空字符串)比寫到處

echo isset($this->data['UserAddress']['address_name']) ? $this->data['UserAddress']['address_name'] : ''; 

空值在陣列從模型的查詢得到了什麼?
謝謝。

回答

4

根據這一existing question,在PHP 5.3有一個新的運營商可能幫助:

echo $this->data['UserAddress']['City']['city_name'] ?: ''; 

需要注意的是,這似乎你只有好處,如果數組中的鍵存在。一些例子:

$test = null; 
echo $test ?: 'default'; // will print 'default' 

$test = array(); 
echo $test['x'] ?: 'default'; // displays notice 'undefined index', prints 'default' 

$test = array('x' => null); 
echo $test['x'] ?: 'default'; // will print 'default' 
+0

那好,謝謝你,但我5.3 PHP之前甚至需要解決方案。可能與遞歸迭代有關。 – 2011-04-05 04:02:53

+0

echo $ test?:'default'is echo!is_null($ test)? $測試:「默認」 PHP5.3 http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary – dogmatic69 2011-04-05 10:52:03

-1

你可以試試這個:

echo @$this->data['UserAddress']['City']['city_name']; 

如果該值設置,那麼它將打印..
如果不是,它會打印什麼,將忽略通知..

希望這有助於...

好運與您的開發...

+1

使用@之前是不是一個好主意,骯髒的黑客 – dogmatic69 2011-04-05 10:53:41

1

使用模型回調。

在afterFind函數中檢查您需要從NULL設置爲「」值的變量。

<?php 
    // IN THE MODEL FOR UserAddress 
    public function afterFind(array $results, bool $primary){ 
     if(!isset($results[ $this->alias ][ 'City' ][ 'city_name' ])){ 
      $results[ $this->alias ][ 'City' ][ 'city_name' ] = ""; 
     } 
     ... 
    }   
?> 

你甚至可以將它抽象出來的行爲,或有其循環中的數據陣列固定零點爲字符串結束。

看看這裏的回調函數(模型)

http://book.cakephp.org/#!/view/1048/Callback-Methods

或者看看這裏的回調方法(控制器)

http://book.cakephp.org/#!/view/984/Callbacks