2016-06-14 155 views
0

問題。如何使用雄辯產生這種查詢:上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(); 

回答

0

你可以做到這一點有兩種方式,一是使用查詢生成器,

$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

1

下面的查詢應該工作:

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