如何在laravel中查询多对多关系表?

时间:2017-11-14 06:45:06

标签: php laravel-5 eloquent

我正在尝试查询我的get api调用的多对多关系。我有三个表,如图所示,但我没有使用数据透视表。

enter image description here

这是我的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中进行这种类型的查询而不使用数据透视表吗?

2 个答案:

答案 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();