Laravel运行多个查询而不是加入Eloquent

时间:2017-01-12 06:19:58

标签: laravel eloquent laravel-5.3

我正在尝试在我的页面表和用户表之间运行连接。意味着一个用户可以创建多个页面,并且页面created_by列属于我的用户表列id

表格结构:

---------------------------------------------
  id  | page_title | page_desc | created_by |    
---------------------------------------------
  1   |  Testing   | Descripti |      1     |
---------------------------------------------
  2   |  New Page  | Desc      |      2     |

用户表

-------------------------------------------
 id  | name  | email | pass | created_at |
-------------------------------------------
 1   |   A   | a@g.c | 123  | 2017-10-21 |
-------------------------------------------
 2   |   B   | b@g.c | 123  | 2017-10-21 |

在我使用的Page模型中:

public function createdBy(){
    return $this->belongsTo('App\User','created_by','id');
}

现在当我试图获取数据时:

$model = Page::all()
foreach($model as $key => $value){

     echo $value->createdBy->name."<br/>";
}

laravel生成多个查询以获取每个用户的名称是运行连接而不是多个查询的任何方式吗?

3 个答案:

答案 0 :(得分:2)

您遇到了with()问题。您需要急切加载您的关系以解决此问题。您可以在eager loading here上阅读更多内容。

使用页面查询中的$model = Page::with('createdBy')->get(); foreach ($model as $key => $value) { echo $value->createdBy->name."<br/>"; } 方法急切加载每个页面的所有相关用户记录:

resources/assets/sass/app.scss

现在只会运行2个查询:一个用于获取所有页面,另一个用于获取与每个页面相关的所有用户。

答案 1 :(得分:1)

因此Laravel提供eager Loading

急切加载

当访问Eloquent关系作为属性时,关系数据是&#34;延迟加载&#34;。这意味着在您首次访问该属性之前,实际上不会加载关系数据。但是,Eloquent可以&#34;急切负载&#34;查询父模型时的关系

有关详细信息,请查看此link

或者只使用Laravel's数据库查询构建器

您可以直接在表上执行连接并直接获取数据

 $users =  DB::table('pages')
         ->join('users', 'pages.created_by', '=', 'users.id')
        ->select('users.name','users.email', 'pages.*') //Specify what parameters you want.
        ->get();

答案 2 :(得分:0)

要加入查询,您可以使用如下所示的laravel查询构建器

$pages = DB::table('pages')
        ->join('users', 'pages.created_by', '=', 'users.id')
        ->select('users.*', 'pages.*')
        ->get();