Laravel数据库查询生成查询模板(按值调用)

时间:2016-08-30 13:59:04

标签: php laravel-5.2 laravel-query-builder

我的问题是关于Laravel数据库查询。通常,每个oop用户都使用私有属性在父类中定义他/她的公共变量,并且由于oop原因从其他子类中使用它 - 可重用性...现在我的问题是当我为私有属性定义一个变量用于私有键,我写一个getter方法(像普通人一样),因为我不想改变原始的常见查询部分,但它总是通过引用调用。

示例(父类):

$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()]);

在定义了查询的常见部分之后,我想将它用作我所有其他子类查询的模板,但是如果我在同一个类中使用它(如下面的子类):

$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方法之后发生变化(卡住)!

我知道DB表无法完成,直到我说“get”但有没有办法使用这样的查询常见部分?我编写了所有代码用于解释,它们可能有语法错误,但它不是关于逻辑的代码。感谢...

1 个答案:

答案 0 :(得分: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"]);