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

1

在你的课上

class User extends \Eloquent {
    protected $table = 'user';
    public $timestamps = FALSE;

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

User <-> Credit您应该使用(在使用自定义键之间建立一对一的关系uid

class User extends \Eloquent {
    protected $table = 'user';
    public $timestamps = FALSE;

    public function credit() {
        return $this->hasOne('Credit', 'uid'); // <---
    }
}

所以,你可以像这样查询

$credit = User::find(1)->credit;
于 2013-10-18T18:21:29.210 回答