Laravel с именем столбца в методе, в котором указано условие c - PullRequest
0 голосов
/ 14 февраля 2020

Недавно я только что понял, что Laravel генерирует метод stati c с именем столбца при объединении в предложении where с использованием регистра верблюда

пример

$user = User::whereName('john')->first(); // added `name` as a column name

Когда вызывается этот код SQL генерирует

$user = User::whereName('john')->toSql();

//it returns
select * from `users` where `name` = ?

Это действительно дает ожидаемый результат, так как возвращает пользователя с именем john.

Я искал Laravel документацию, но не могу найти это функция или где она была определена.

Все, что мне нужно, это уточнить, хорош этот метод или лучше, чтобы я мог продолжать его использовать, а также знать, как метод генерируется в рамках Laravel или любым другим способом.

Ответы [ 4 ]

1 голос
/ 14 февраля 2020

Этот подход полностью ле git, ты плохо документирован. В Query\Builder он использует функцию перезаписи __call для создания функциональности, и вы можете увидеть точную функцию здесь .

Тема магических c методов и __call функция, часто весьма спорная, если они к лучшему. Если вы используете IDE helper . Он на самом деле напечатает подсказку для методов для вас и, следовательно, ослабит некоторые магические подходы, которые он выберет, и предоставит вам плавный опыт IDE.

Пример сгенерированных подсказок типа из локального проекта, который у меня есть.

* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\User whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\User whereEmail($value)

Поэтому я бы не волновался, что это не лучший подход. Есть много способов сделать то, что вы делаете, но этот является одним из правильных.

1 голос
/ 14 февраля 2020

Если вы спрашиваете, где код отвечает за его работу, он использует метод c magi __call() (__callStatic() перед этим для создания экземпляра) в классе Illuminate\Database\Query\Builder

/**
     * Handle dynamic method calls into the method.
     *
     * @param  string  $method
     * @param  array   $parameters
     * @return mixed
     *
     * @throws \BadMethodCallException
     */
    public function __call($method, $parameters)
    {
        if (static::hasMacro($method)) {
            return $this->macroCall($method, $parameters);
        }

        if (Str::startsWith($method, 'where')) {
            return $this->dynamicWhere($method, $parameters);
        }

        static::throwBadMethodCallException($method);
    }

точно в состоянии Str::startsWith($method, 'where'), которое перенаправляет вызов на dynamicWhere()

/**
     * Handles dynamic "where" clauses to the query.
     *
     * @param  string  $method
     * @param  array  $parameters
     * @return $this
     */
    public function dynamicWhere($method, $parameters)
    {
        $finder = substr($method, 5);

        $segments = preg_split(
            '/(And|Or)(?=[A-Z])/', $finder, -1, PREG_SPLIT_DELIM_CAPTURE
        );

        // The connector variable will determine which connector will be used for the
        // query condition. We will change it as we come across new boolean values
        // in the dynamic method strings, which could contain a number of these.
        $connector = 'and';

        $index = 0;

        foreach ($segments as $segment) {
            // If the segment is not a boolean connector, we can assume it is a column's name
            // and we will add it to the query as a new constraint as a where clause, then
            // we can keep iterating through the dynamic method string's segments again.
            if ($segment !== 'And' && $segment !== 'Or') {
                $this->addDynamic($segment, $connector, $parameters, $index);

                $index++;
            }

            // Otherwise, we will store the connector so we know how the next where clause we
            // find in the query should be connected to the previous ones, meaning we will
            // have the proper boolean connector to connect the next where clause found.
            else {
                $connector = $segment;
            }
        }

        return $this;
    }
0 голосов
/ 14 февраля 2020

вам нужно определить эту функцию в вашей модели

//controller
$userObj=new \App\User();
$userObj->whereName('john');
//model
function whereName($name){
return $this->where('name',$name)->first();
}
0 голосов
/ 14 февраля 2020

Попробуйте

1002 *
...