1

私は現在、この奇妙な行動に直面しています。

<?php
// Models
class User extends \Eloquent {
    protected $table = 'user';
    public $timestamps = FALSE;

    public function credit() {
        return $this->hasOne('Credit', 'uid');
    }
}
class Credit extends \Eloquent {
    protected $table = 'user_credit';
    public $timestamps = FALSE;

    public function user() {
        return $this->belongsTo('User', 'uid');
    }
}

// Service
function doThings() {
    // This is always working 
    $credit = Credit::where('uid', $user->id)->first(); 
    // This doesn't work in test environment, but it does outside of it, i.e. in a route
    // $credit = $user->credit; 
    if (empty($credit)) {
        $credit = new Credit();
        // Set some fields... then save.
        $credit->foo = 'bar';
    }   
    $user->credit()->save($credit);
}

// Test
Service::doThings(); // <--- works as expected the first time
Service::doThings(); // <--- fails, trying to save a new record instead of updating.

// In a test route
Route::get('/test', function() {
    $user = User::find(1);
    Service::doThings(); // <--- works as expected
    Service::doThings(); // <--- works as expected
    Service::doThings(); // <--- works as expected
    return 'test';
});

問題は、$user->credit を介してクレジット モデルにアクセスする場合、テスト環境でモデルがロードされず、データベース内のアイテムの存在に関係なく NULL が返されることです。Credit: を使用して明示的にロードすると機能します。探す()。

テスト環境の外では、物事は期待どおりに機能します。

ヒントはありますか?

4

1 に答える 1