1

我的问题是关于 Laravel 数据库查询。通常,每个 oop 用户在父类中使用私有属性定义他/她的公共变量,并从其他子类中使用它,因为 oop 原因 - 可重用性......现在我的问题是当我为带有私有的 DB 查询定义一个变量时关键,我写了一个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 方法之后,我宝贵的私有变量发生了变化(卡住了)!

我知道数据库表在我说“get”之前无法完成,但是有没有办法像这样使用查询公共部分?我写了所有的代码来解释,它们可能有语法错误,但这不是关于代码而是关于逻辑的。谢谢...

4

1 回答 1

1

如果我理解您的代码,您需要将查询放入常规方法中,以便在每次调用时重新创建查询对象。如果将其放入属性 ( $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"]);
于 2017-09-23T22:23:19.777 回答