如何在Laravel类中访问保护变量

时间:2016-06-21 16:33:52

标签: php class laravel protected

我不明白如何在同一个类中访问表名。

class Timesheets extends Model
{
    protected $table = "timesheets";

    public static function getAllTimesheets() {
        //return DB::table("timesheets")->get();
        return DB::table("timesheets")
            ->join('users', 'name', '=', 'users.name')
            ->select('timesheets.id', 'name', 'timesheets.time_start', 'timesheets.time_end', 'timesheets.time_desc')
            ->get();
    }
}

如何用受保护的Table变量替换“timesheets”?

5 个答案:

答案 0 :(得分:2)

直接回答(new static)->getTable()

class Timesheets extends Model
{
    protected $table = "timesheets";

    public static function getAllTimesheets() {
        return DB::table((new static)->getTable())
            ->join('users', 'name', '=', 'users.name')
            ->select('timesheets.id', 'name', 'timesheets.time_start', 'timesheets.time_end', 'timesheets.time_desc')
            ->get();
    }
}

了解更多的机会

Eloquent Models使用Magic Functions,允许您通过静态函数调用检索新的类实例的非静态方法; Illuminate/Database/Eloquent/Model::__callStatic()

  在静态上下文中调用不可访问的方法时会触发

__callStatic()

查看code for Illuminate/Database/Eloquent/Model::__callStatic()我们看到$instance = new static;调用Late Static Bindings。这意味着您将获得的值与新的类实例化相同。作为@PeterPan666 commented,只有在当前类中根本不存在所请求的方法时,这才会起作用。查看code for Illuminate/Database/Eloquent/Model::__call(),我们会看到此调用将发送到模型表的新查询Builder

作为Álvaro Guimarães answered,您可以使用static::join()开始查询模型的表格。

class Timesheets extends Model
{
    protected $table = "timesheets";

    public static function getAllTimesheets() {
        return static::join('users', 'name', '=', 'users.name')
            ->select('timesheets.id', 'name', 'timesheets.time_start', 'timesheets.time_end', 'timesheets.time_desc')
            ->get();
    }
}

答案 1 :(得分:0)

Manual for PhP visibility。受保护的变量可以在类本身和继承的类中访问,因此您可以尝试进行的操作。它由关键字$this调用。但是,您的函数声明为static,这会导致$this->出现问题。尝试:

 return DB::table((new static)->getTable())->...

或者通过删除static关键字简单地使函数非静态。

答案 2 :(得分:0)

您已将getAllTimesheets定义为静态函数。

但是,静态函数与类相关联,而不是类的实例。因此,getAllTimesheets不提供$ this。

要访问$ table变量,请将getAllTimesheets定义为

的实例方法
public function getAllTimesheets() { // Code // }

有了这个,你可以在函数中访问$ this变量,并且可以访问$table variable$this->table

答案 3 :(得分:0)

您无法像这样访问$ table。虽然你可以做类似

的事情
return DB::table((new static)->getTable())->...

另一种解决方案是将getAllTimesheets作为范围

public function scopeGetAllTimesheets() {
    // return DB::table($this->table)
    return DB::table($this->getTable())
        ->join('users', 'name', '=', 'users.name')
        ->select('timesheets.id', 'name', 'timesheets.time_start', 'timesheets.time_end', 'timesheets.time_desc')
        ->get();
}

你可以这样称呼它

$timeSheets = Timesheets::getAllTimesheets();

我认为使用getTable会更好,因为它会为您提供$table或Laravel方法来为模型构建表名。

答案 4 :(得分:0)

使用常规静态语法:

qhull