Создание цепочечного метода в Laravel 4

Я попытался обновить это отличное решение Коллина Джеймса для работы в Laravel 4.

Пока не знаю без везения. Вот что я придумал:

/app/libraries/Model.php (я зарегистрировал каталог библиотек с помощью композитора)

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 (я зарегистрировал каталог библиотек с помощью композитора)

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',
    ...
)

Единственное, что работает, это:

  • «Покажите мне, работает ли расширение модели».

Другие «маркеры» не работают:

  • query() вообще не вызывается
  • Используется Eloquent/Query вместо того, чтобы сначала смотреть на Elegant/Query

person Ronald Hulshof    schedule 12.06.2013    source источник
comment
Ничего из этого, вероятно, не нужно, можете ли вы вместо этого сказать нам, что вы хотите сделать (поскольку это, вероятно, возможно, без перезаписи метода).   -  person clone1018    schedule 12.06.2013


Ответы (1)


Вы имеете в виду 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)

person Barryvdh    schedule 12.06.2013
comment
Можно ли также установить таким образом свойства $hidden и $visible? stackoverflow.com/questions/16917051 / - person Ronald Hulshof; 14.06.2013