Laravel:加入雄辩模特

问题描述:

问题。如何使用雄辩产生这种查询:上campaigns.gamemaster_id = users.id其中campaigns.status = 1Laravel:加入雄辩模特

广告活动

SELECT campaigns.name,users.name FROM活动LEFT JOIN用户

id gamemaster_id name  status 
1 1    campaign1 1 
2 2    campaign2 1 

用户

id name 
1 rick 
2 bob 

结果

id gamemaster_id name  status gamemaster_name 
1 1    campaign1 1  rick 
2 2    campaign2 1  bob 

运动模式

class Campaign extends Model 
{ 
    public function gamemaster() 
    { 
     return $this->belongsTo('App\User', 'gamemaster_id'); 
    } 
} 

我尝试做侃侃而谈,但失败:

$result = Campaign::where('status', '=', 1)->with('gamemaster')->select('name')->orderBy('users.updated_at', 'desc')->get(); 

你可以做到这一点有两种方式,一是使用查询生成器,

$campaigns = DB::table('campaigns')->leftJoin('users', 'campaigns.gamemaster_id', '=', 'users.id') 
      ->select(['campaigns.name as name', 'users.name as gamemaster_name']) 
      ->where('campaigns.status', '=', 1) 
      ->orderBy('users.updated_at', 'desc') 
      ->get(); 

并与预先加载,就可以得到运动像下面。但是,要按关系属性进行排序,则需要另一个不易实现的图层。

$campaigns = Campaign::where('status', '=', 1)->with(['gamemaster' => function($query){ 
    $query->select(['id', 'name']); 
}]->select('id', 'gamemaster_id', 'name')->get(); 

但是你可以使用收集功能可以轻松地对它进行排序(然而,这将需要更多的执行时间)

$campaigns = Campaign::where('status', '=', 1)->with(['gamemaster' => function($query){ 
    $query->select(['id', 'gamemaster_id', 'name', 'updated_at']); 
}]->select('id', 'name')->get()->sortByDesc(function ($campaign) { 
    return $campaign->gamemaster->updated_at; 
}) 
+0

谢谢。第一个似乎工作。但是急切的加载提供了这个查询:“select'id',''''''''''''''status''''''''''也许它缺少一个联接部分? – Olof84

+0

欢迎,不需要加入,它会选择属于状态为1的广告系列的游戏管理员。因此,有两个查询正在运行,首先选择广告系列,其次选择属于该广告系列的用户。它是否返回任何错误或显示意外的结果?我还应该注意到,要订购具有用户更新属性的广告系列,您需要另一个层,这就是为什么联接方式更容易。 – Burak

+0

当我运行它时,它会这样说:SQLSTATE [42S22]:列未找到:1054'字段列表'中的未知列'gamemaster_id'(SQL:select'id','gamemaster_id','name','updated_at' (0)中的'sh_users'.'id')。我在我的实际项目中用sh在我的表前加上了前缀。 – Olof84

下面的查询应该工作:

Campaign::whereStatus(1) 
    ->join('users', 'campaigns.gamemaster_id', '=', 'users.id') 
    ->select('campaigns.name', 'users.name') 
    ->orderBy('users.updated_at', 'desc') 
    ->get() 
+0

你的意思是:运动::这里('状态,‘=’1 ) - >加入('users','campaigns.gamemaster_id','=','users.id') - > select('campaigns.name','users.name') - > get()。当我运行它时,什么都不会返回。嗯,是否有可能看到刚刚运行的SQL? – Olof84

+0

whereStatus(1)或where('status','=',1)是相同的。你错过了你的状态。如果你只是做“Campaign :: whereStatus(1) - > get()”,你有什么? –

+0

我看到您的查询返回2个用户名,但仅此。而查询似乎是:“从'campaign'内部连接'users'选择'campaigns'.'name','users'.'name'''campaign'' campaigns'.'gamemaster_id' ='users'.'id' where 'campaign'.'status' =?“但它没有秩序。 – Olof84