我正在尝试查询我的get api调用的多对多关系。我有三个表,如图所示,但我没有使用数据透视表。
这是我的Projects模型类,这是函数
public function projectRewd()
{
return $this
->belongsToMany('App\Rewards','rewards','project_id','reward_id');
}
这是我的奖励模型类和功能
public function projectShip()
{
return $this->belongsToMany('App\Shipping_location','shipping_location','projects_id','rewards_id');
}
这是我的api控制器功能
Route::get('projects/{id}', function($id) {
$proj = Projects::whereHas('projectRewd', function($q)
{
$q->where('id', $id);
});
return $proj;
});
我正在使用此链接进行api通话
http://localhost:8000/api/projects/1
我想提取与project_id关联的奖励数据和shipping_location数据。
我收到此错误
"message": "Object of class Illuminate\\Database\\Eloquent\\Builder could not be converted to string"
我检查并尝试了来自不同帖子的所有相关错误。
我也搜索并尝试了很多技巧。不能解决我的问题。 请建议我怎么做? 我可以在larvel中进行这种类型的查询而不使用数据透视表吗?
答案 0 :(得分:0)
基于闭包的控制器返回查询构建器对象。不是一个项目。您需要通过提取,例如从查询中检索结果第一个结果(->first()
)或全部(->get()
)。
Route::get('projects/{id}', function($id) {
$proj = Projects::whereHas('projectRewd', function($q)
{
$q->where('id', $id);
})->first();
return $proj;
});
引用$ id:
$ id未知的原因是闭包不知道它。
您可以使用use(...)
将其传递给闭包。
Route::get('projects/{id}', function($id) {
$proj = Projects::whereHas('projectRewd', function($q) use ($id)
{
...
<强>此外:强>
您的whereHas查询对我来说不正确:
$q->where('id', $id);
显然$id
是项目ID。但是projectRewd中的'id'列是projectRewd的主键(除非你修改了默认值)。
我假设您要查询至少有一个projectRewd:
的所有项目Route::get('projects/{id}', function($id) {
$proj = Projects::has('projectRewd')->first();
return $proj;
});
如果你想加载连接表:
Route::get('projects/{id}', function($id) {
$proj = Projects::with('projectRewd. projectShips')->has('projectRewd')->first();
return $proj;
});
答案 1 :(得分:0)
您正在获取Builder模型,因为您忘记添加->first()
或->get()
。
你应该写:
$proj = Projects::whereHas('projectRewd', function($q){
$q->where('id', $id);
})->first();