多次调用Eloquent动态属性会多次访问数据库吗?

tho*_*hom 6 php laravel eloquent laravel-4

http://laravel.com/docs/4.2/eloquent#dynamic-properties

class Phone extends Eloquent {

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

}

$phone = Phone::find(1);
Run Code Online (Sandbox Code Playgroud)

现在,如果我然后做这样的事情:

echo $phone->user->email;
echo $phone->user->name;
echo $phone->user->nickname;
Run Code Online (Sandbox Code Playgroud)

每当我使用->user动态属性时,Eloquent是否会进行数据库调用?或者这是否足够聪明,可以在第一次通话时缓存用户?

pat*_*cus 7

在您的示例中,对象user上的$phone属性将是延迟加载的,但它只会加载一次.

还要记住,一旦加载了对象,它就不会反映对基础表的任何更改,除非您使用该load方法手动重新加载关系.

以下代码说明了该示例:

$phone = Phone::find(1);

// first use of user attribute triggers lazy load
echo $phone->user->email;

// get that user outta here.
User::destroy($phone->user->id);

// echoes the name just fine, even though the record doesn't exist anymore
echo $phone->user->name;

// manually reload the relationship
$phone->load('user');

// now will show null, since the user was deleted and the relationship was reloaded
var_export($phone->user);
Run Code Online (Sandbox Code Playgroud)

  • @thomthom是的,渴望加载将至少创建两个数据库调用.但是,它可以防止n + 1问题.如果您执行`$ phones = Phone :: all();`,然后通过所有电话对象并显示用户名,它将执行一个查询以获取所有电话,然后为每个电话单独的用户查询循环迭代(n + 1).但是,如果你通过`$ phones = Phone :: with('user') - > get();`来加载,并运行相同的foreach,那么总共只能进行2次数据库调用,一次用于手机,以及一个适用于所有相关用户. (2认同)