Sve*_* E. 4 php model relationship laravel eloquent
我正在使用Laravel 5构建一个简单的时间跟踪应用程序,其中我有两个Laravel模型,一个名为"User",一个名为"Week"
关系非常简单:
Week.php:
public function user()
{
return $this->belongsTo('App\User');
}
Run Code Online (Sandbox Code Playgroud)
user.php的:
function weeks()
{
return $this->hasMany('App\Week');
}
Run Code Online (Sandbox Code Playgroud)
现在,User.php文件还有一个名为"getCurrentWeek()"的简单助手/新手函数,顾名思义,它返回当前周
function getCurrentWeek()
{
$possibleWeek = $this->weeks->sortByDesc('starts')->all();
if(count($possibleWeek) != 0)
{
return $possibleWeek[0];
}
else
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果我为用户创建第一周并将其附加/关联到用户,如下所示:
$week = new Week;
//Omitted: Setting so attributes here ...
$week->user_id = $user->id;
$weeks->save()
$user->weeks()->save($week);
Run Code Online (Sandbox Code Playgroud)
然后调用$user->getCurrentWeek();方法,该方法返回null,虽然已经创建了新的一周,但是与用户相关并且已经保存到数据库中.在我看来,预期的行为将是getCurrentWeek()返回新创建的一周.
我在这里对Eloquent的误解是什么?做错了什么?
pat*_*cus 11
关系属性在第一次访问时是延迟加载的.加载后,它们不会自动刷新添加或从关系中删除的记录.
由于您的getCurrentWeek()函数使用了relationship属性,因此该代码将起作用:
$week = new Week;
// setup week ...
$user->weeks()->save($week);
// $user->weeks attribute has not been accessed yet, so it will be loaded
// by the first access inside the getCurrentWeek method
dd($user->getCurrentWeek());
Run Code Online (Sandbox Code Playgroud)
但是,这段代码不起作用:
// accessing $user->weeks lazy loads the relationship
echo count($user->weeks);
// relate a new record
$week = new Week;
// setup week ...
$user->weeks()->save($week);
// $user->weeks inside the method will not contain the newly related record,
// as it has already been lazy loaded from the access above.
dd($user->getCurrentWeek());
Run Code Online (Sandbox Code Playgroud)
您可以修改getCurrentWeek()方法以使用关系方法($this->weeks())而不是属性($this->weeks),它将始终命中数据库,或者您可以load()在添加或删除记录后重新加载关系(使用方法).
更改getCurrentWeek()方法以使用关系方法weeks()(由@Bjorn提供的更新方法)
function getCurrentWeek()
{
return $this->weeks()->orderBy('starts', 'desc')->first();
}
Run Code Online (Sandbox Code Playgroud)
或者,使用以下load()方法刷新关系:
// accessing $user->weeks lazy loads the relationship
echo count($user->weeks);
// relate a new record
$week = new Week;
// setup week ...
$user->weeks()->save($week);
// reload the weeks relationship attribute
$user->load('weeks');
// this will now work since $user->weeks was reloaded by the load() method
dd($user->getCurrentWeek());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4171 次 |
| 最近记录: |