2016-07-07 46 views
0

我们有两个模型和方法历史雄辩模型访问的方法调用关系数据

class Employment_request extends Model { 
    protected $table = 'employment_requests'; 
    // some code here 
    public function history(){ 
     return $this->hasMany('App\Employment_history'); 
    } 
} 


class Employment_history extends Model { 
    protected $table = 'employment_history'; 
    // some code 
} 

让Employment_request的创建实例:

$r = Employment_request::find(28) 

在这种情况下,方法的历史数据请求时, Employment_request的实例已创建。不是吗?
- 对象需要更多的内存
- 需要更多的时间来创建它
- 访问对象创建的心不是后加历史数据

,因为当我添加新的历史纪录:

Employment_history::create([ 
    'user_id' => 17, 
    'employment_request_id' => 28, 
    'change' => '? Stefanka' 
]); 

和呼叫方法:

$r->history; 

一个新的记录没有与集合返回,但重新创建对象后它是。 但是,当我打电话:

$r->history()->get() 

我不需要重新创建,以获得新的数据。

它是如何工作的? 在修补程序控制台中测试。

+0

'在这种情况下,在创建Employment_request实例时请求方法历史数据。不是吗?',只有当你打电话给'历史记录'时才能使用; –

+0

Lets countinue ... –

+0

添加的结果... –

回答

1

laravel中有三种类型的方法来加载关系数据。急于加载,延迟加载和懒惰加载。急切加载当您检索父模型数据时,您必须添加您必须将关系名称传递给with方法(Employment_request::with('history')->find(28)),那么您可以通过将其作为类变量($r->history;)调用来访问该关系。如果您使用此方法,则只会在检索父模型数据时在数据库上提供关系记录。如果您想在手动添加新关系记录后获得关系,则必须使用从数据库中检索最新数据的延迟加载方法($r->history()->get())。这就是为什么你不能通过方法访问你的新记录(急切加载)。

+0

谢谢您的评论。我的3个结论怎么样(除了最后一个)。他们是否正确? –

+0

在方法主体中使用简单的查询:**返回Employment_history :: where('employment_request_id',$ this-> id); **似乎是一个更好的解决方案,指定了关系。 –

+0

取决于您用于获取关系数据的方法,因为要加载它是真实的,但对于延迟加载或惰性加载,您可以获取新记录。为了通过关系保存新记录laravel有自己的方法(附加,同步和保存)。尝试尽可能使用热切加载加载数据,这比其他方法更快 –