我有三种模式:
用户:
public function projects()
{
return $this->hasMany('StoredFile', 'user_id', 'id')->with('files');
}
StoredFile:
public function files()
{
return $this->hasMany('File', 'hash', 'user_hash');
}
和没有关系方法的文件模型
问题:
我使用以下代码来获取项目和每个项目存储的文件:
$projects = $user->projects;
var_dump(json_encode($projects))
// {"project_name":"test","user_hash":"64650458b6Fhgd68ca57308222","files":[{"id":1,"name":"example.pdf"}]}
我可以使用count($ projects [0] - >文件)来获取文件数
但是这个$ projects变量需要通过Response :: json
返回到客户端return Response::json($project);
我无法将文件泄漏给访问者,我想修改StoredFile模型只返回文件数
就像:
return $this->hasMany('File', 'hash', 'user_hash')->count();
但这会给我一个错误:
在非对象“
上调用成员函数addEagerConstraints()如何在关系中收到计数值?
请帮忙!感谢
答案 0 :(得分:4)
protected $appends = array('file_count');
public function getFileCountAttribute()
{
return $this->files->count()
}
这会将file_count
属性附加到每个文件对象
答案 1 :(得分:1)
关系方法必须返回Illuminate\Database\Eloquent\Relations\Relation
类型的对象。您的files()
功能没有任何问题,但不是关系,因此无法在您的projects()
功能中使用。
问题代码是with('files')
,因为Laravel希望从Illuminate\Database\Eloquent\Relations\Relation
函数返回files()
类型的对象,而是接收int
您可以手动将此值添加到模型中。尝试将此添加到您的StoredFile
模型中:
public function fileCount() {
return $this->hasMany('File', 'hash', 'user_hash')->count();
}
更改User
型号:
public function projects() {
return $this->hasMany('StoredFile', 'user_id', 'id');
}
现在使用:
$projects = $user->projects;
$project = $project->first();
$project->fileCount = $project->fileCount();
var_dump(json_encode($project));
// {..., "fileCount":"1"}
请记住,每次请求时都会从数据库中查询文件数,因此如果需要返回多个项目,则效率不高。鉴于您正在返回JSON响应,我认为情况确实如此!
否则,为什么不做这样的事情:
public function files() {
return $this->hasMany('File', 'hash', 'user_hash');
}
public function projects() {
return $this->hasMany('StoredFile', 'user_id', 'id')->with('files');
}
现在使用:
$projects = $user->projects;
$project = $project->first();
$project->fileCount = $project->files->count();
unset($project->files);
var_dump(json_encode($project));
// {..., "fileCount":"1"}
这样的东西应该有用吗?