在Laravel 4中创建一个可链接的方法

时间:2013-06-12 14:10:40

标签: php laravel eloquent

我已尝试更新this excellent solution of Collin James以使用 Laravel 4

直到知道没有运气。这就是我想出的:

/app/libraries/Model.php (我已经使用composer注册了libraries目录)

namespace Elegant;

class Model extends \Illuminate\Database\Eloquent\Model {
    function __construct() 
    {
        echo 'Show me if the Model exension works<br />';
    }

    protected function query()
    {
        echo 'Show me if the query function gets called<br />';
        return new \Elegant\Query($this);
    }
}

/app/libraries/Query.php (我已经使用composer注册了libraries目录)

namespace Elegant;

class Query extends \Illuminate\Database\Query {

    public function __construct() 
    {
        echo 'Show me if the Query exension works<br />';
    }

    public function byArray($column, $value) 
    {
        if (is_array($value))
            return $this->whereIn($column, $value);
        else
            return $this->where($column, '=', $value);
    }

    public function __call()
    {
    }
}

/app/config/app.php

'aliases' => array(
    ...
    'Eloquent'        => 'Elegant\Model',
    ...
)

唯一有效的是:

  • “如果模型表现有效,请告诉我。”

其他“标记”不起作用:

  • 查询()根本没有被调用
  • 使用Eloquent / Query,而不是先查看Elegant / Query

1 个答案:

答案 0 :(得分:0)

QueryScopes是什么意思? http://laravel.com/docs/eloquent#query-scopes 您可以为查询添加自定义范围。您还可以添加额外的参数,但始终添加$ query(并且是当前查询) 可能类似于:

public function scopeByArray($query, $column, $value)
{
    if (is_array($value))
        return $query->whereIn($column, $value);
    else
        return $query->where($column, '=', $value);
}

然后只是User::byArray($column, $value)->orderBy(..)

你可以扩展Eloquent并在那里添加函数(class BaseModel extends Eloquent