代码之家  ›  专栏  ›  技术社区  ›  Egretos

拉维尔重写$model->someQueryHere->get()

  •  0
  • Egretos  · 技术社区  · 6 年前

    我有一节课 SomeModel SomeParentModel . SomeParentModel公司 get() 方法 某个模型 查询生成器。

    $someModel
        ->where('something')
        ->andWhere('something')
        ->orderBy('field')
        ->get()
    //    ^^^
    // This method must to be custom
    

    我试着用 Model scopes ,但这似乎不适用于违约。

    public function scopeGet($query)
        {
            $query = $this->filter($query);
    
            dd('I`m tried :( This code not running, because i dont see this messsage');
    
            return $query;
        }
    
    public function filter($query;)
        {
            if ($this->id) {
                $query->where('id', $this->id);
                return $query
            }
    
            if ($this->name) {
                $query->where('name', 'like', "%$this->name%");
            }
    
            if ($this->phone) {
                $query->whereHas('phones', function (Builder $q) {
                    $q->where('number', 'like', "%$this->phone%");
                });
            }
    
            return $query;
        }
    

    我该怎么做?

    2 回复  |  直到 6 年前
        1
  •  1
  •   abr    6 年前

    不确定你的目标是什么 get()

    所有的模型都是从 Illuminate\Database\Eloquent\Model https://laravel.com/api/5.6/Illuminate/Database/Eloquent/Model.html

    您可以创建一个继承自此模型的新类,覆盖所需的方法,然后 SomeModel 扩展您刚刚创建的这个新类。

    不过,我建议(我想不出你想覆盖它的函数性)如果你计划有一个不同的构建,就创建一个作用域(甚至全局作用域)。

        2
  •  1
  •   Tom    6 年前

    你的问题还不完全清楚。但是如果你想创建类似filter()方法的东西。拉维尔提供 when() 方法。

    这意味着你可以做如下事情:

    $someModel
        ->when($id = $this->id, function($query) use ($id) {
            $query->where('id', $id)
         })
        ->when($name = $this->name, function($query) use ($name) {
            $query->where('name', $name)
         })
        ->when($phone = $this->phone, function($query) use ($phone) {
            $query->whereHas('phones', function (Builder $q) {
                $q->where('number', 'like', "%" . $phone);
            });
         })
        ->orderBy('field')
        ->get();