2016-08-30 58 views
1

我的問題是關於Laravel db查詢。通常每個oop用戶都在私有屬性的父類中定義他/她的公共變量,並且由於其他子類的原因使用它 - 重用性......現在我的問題是當我爲私有數據庫查詢定義一個變量時關鍵,我寫了一個getter方法(就像普通人),因爲我不想改變原始的普通查詢部分,但它總是通過引用調用。Laravel DB查詢使查詢模板(按值調用)

例(父類):

$this->userConfirmedPackageData = DB::table('payments') 
     ->join('users', 'users.id', '=', 'payments.user_id')-> 
     *.....continue with more join* 
     ->join('subjects', 'subjects.id', '=', 'classroom_subject.subject_id') 
     ->where(['payments.confirmed' => 1, 'payments.user_id' => $this->currentUser->getUserId()]); 

界定查詢的共同部分,我想用它像模板我的所有其他子類的查詢,但如果我用它在同一個班級像下面後(Child Class):

$firstQuery = $this->getUserConfirmedPackageData()->join("aTable")->where("something.id",3)->get(["something.id"]); 
$secondQuery = $this->getUserConfirmedPackageData()->join("bTable")->where("somethingDifferentTable.user_id",1111)->take(5)->get(["somethingDifferentTable.name"]); 

第一個get方法後,我的寶貴的私有變量(卡住)!

我知道數據庫表不能完成,直到我說「得到」,但有沒有什麼辦法使用查詢這樣的共同部分?我寫了所有的代碼來解釋,他們可能有語法錯誤,但它不是關於邏輯的代碼。謝謝...

回答

0

如果我理解你的代碼,你需要把你的查詢放入一個常規方法,以便在每次調用時重新創建查詢對象。如果將其放入屬性($this->userConfirmedPackageData),即使您調用getter方法($this->getUserConfirmedPackageData()),查詢對象也會重用。

我建議類似如下:

public function userConfirmedPackageQuery() { 
    return DB::table('payments') 
     ->join('users', 'users.id', '=', 'payments.user_id')-> 
     // *.....continue with more join* 
     ->join('subjects', 'subjects.id', '=', 'classroom_subject.subject_id') 
     ->where(['payments.confirmed' => 1, 'payments.user_id' => $this->currentUser->getUserId()]); 
} 

這樣使用它:

$firstQuery = $this->userConfirmedPackageQuery()->join("aTable")->where("something.id",3)->get(["something.id"]); 
$secondQuery = $this->userConfirmedPackageQuery()->join("bTable")->where("somethingDifferentTable.user_id",1111)->take(5)->get(["somethingDifferentTable.name"]);