2016-08-30 57 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"]);