Laravel多模型关系返回计数

时间:2014-08-21 23:01:31

标签: php database laravel orm relational-database

我有三种模式:

用户:

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()

如何在关系中收到计数值?

请帮忙!感谢

2 个答案:

答案 0 :(得分:4)

@Warren Moore几乎是正确的,但我刚刚找到了一个更好的解决方案:

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"}

这样的东西应该有用吗?