2015-06-19 44 views
2

我部署我的應用程序,以我的生產環境沒有運行按預期它不工作。我已經將問題縮小到了我的控制器中該循環內的一行。Laravel方法attributesToArray()對生產

foreach($temp_table_data as $a_payment) { 
    //array_push($payments, $a_payment->payment); //big collection object 
    array_push($payments, $a_payment->payment->first()->attributesToArray()); //smaller object 
} 

我得到的錯誤是call to a member function attributesToArray() on a non object。這看起來很瘋狂,因爲 - 正如那句老話 - 它在我的機器上運行良好。

我的dev。環境是PHP 5.5.21上的Ubuntu trusty64,我的作品是RedHat Linux PHP 5.5.11。我認爲這些差異是非常小的(也許我錯了?)。

如果我做了print_r($temp_table_data()那麼我會收到一個大集合。兩臺服務器上都一樣。所以在某個時候它只是停止喜歡payment(這是一種方法)或first()

這是我的TempTable.php模型與付款方法的部分;

public function payment(){ 
    return $this->hasMany('App\Models\Payment', 'Vendor ZIP', 'postcode'); 
} 

和我的Payment.php模型(它的一部分);

class Payment extends Model { 

protected $table = 'headquarters_data'; 

public function tempTable() 
{ 
    return $this->belongsTo('App\Models\TempTable', 'postcode', 'Vendor ZIP'); 
} 
+0

也許考慮'firstOrFail()'的情況下有支付任何結果() –

回答

1

其中tempTable機型可是沒有一個PaymentattributesToArray()方法是失敗的。

試試這個,看看它是否工作。

foreach($temp_table_data as $a_payment) { 
    $payment = $a_payment->payment->first(); 
    if(!is_null($payment)){ 
      $payments[] = $payment->attributesToArray(); 
    } 
} 
+0

成功!我的數據正在加載。但是,你怎麼能說我的tempTable模型沒有付款?這不是我在原來的帖子裏寫的嗎?雖然這個答案的工作,@Salar答案沒有。雖然兩者都有類似的想法。 – mikelovelyuk

+0

我還可以添加 - 在「大集合對象」(請參閱​​原始文章)上執行'print_r($ payments)'確實返回了數據。有點。它爲我的每個temp_table行返回一個集合,但前1000個左右爲空。空白,因爲沒有成功的比賽。也許這是問題?我的測試環境有更小的數據集... – mikelovelyuk

+0

是的 - 我剛剛檢查了我的開發服務器。每個temp_table結果都有一個匹配的付款記錄。所以我從來沒有得到一個錯誤。該死的,我從來沒有想過去測試一下。艱難的課程。謝謝 – mikelovelyuk

1

的問題是,在生產中,你可能已經改變了數據在數據庫中,並打電話給第一()方法返回那麼你試圖在空撥打attributesToArray(),這是錯誤的!
你應該在調用attributesToArray()之前做一個isset()函數。

if(isset($a_payment->payment->first())) 
array_push($payments, $a_payment->payment->first()->attributesToArray()); 
+0

你基本上由相同的點作爲@PawelBieszczad我的看法,但'isset'表現略有不同,以'!is_null'。儘管你對這些數據很有興趣。謝謝 – mikelovelyuk