Как исключить определенные столбцы при использовании красноречивый

Как исключить определенные столбцы при использовании красноречивый

12.05.2014 06:50:14 Просмотров 100 Источник

Когда я использую eloquent, я могу использовать метод "where", а затем метод "get", чтобы заполнить объект, содержащий то, что я выбрал в своей базе данных. Я имею в виду:

$users = User::where('gender', 'M')->where('is_active', 1)->get(['pseudo', 'email', 'age', 'created_at'])->toArray();

Здесь я могу выбрать столбцы, которые я хочу получить, как "псевдо", "электронная почта"и т. д.. Но то, что мне не хватает в laravel doc, - это способ сделать наоборот. Это может быть что-то вроде этого:

$users = User::where('gender', 'M')->where('is_active', 1)->notGet(['pseudo', 'email', 'age', 'created_at'])->toArray();

Спасибо за ваш ответ futur и хорошего дня.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent#comment36249825_23612221
Вопрос в том, почему вы хотите это сделать? Используя ORM, вы бы предпочли этого не делать, и если вы просто не хотите показывать некоторые столбцы, есть и другие способы добиться этого.
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent#comment36250977_23612221
Я спрашиваю об этом, потому что, когда у вас есть 15 столбцов, и вы хотите 13, это может быть быстрее сделать что-то вроде- >notGet(['column14', 'column15']); вместо - >>get(['column1', 'column2', [...], 'column13']);. Видишь ?
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent#comment36252301_23612221
Вы не понимаете, я спросил почему? Разве что это не красноречиво связано.
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent#comment36277929_23612221
Ты тоже не понимаешь, потому что я сказал почему.. вот почему я написал "потому что" в своем ответе.

Ответы - Как исключить определенные столбцы при использовании красноречивый / How to exclude certains columns while using eloquent

Является ответом!
Razor

12.05.2014 07:15:35

Насколько мне известно, нет сборки в SQL, чтобы исключить столбцы явно, так что Laravel не могу. Но вы можете попробовать этот трюк

Обновление

Еще один трюк-указать все столбцы в вашей модели

protected $columns = array('id','pseudo','email'); // add all columns from you table

public function scopeExclude($query,$value = array()) 
{
    return $query->select( array_diff( $this->columns,(array) $value) );
}

Тогда вы можете сделать :

$users = User::where('gender', 'M')->where('is_active', 1)->exclude(['pseudo', 'email', 'age', 'created_at'])->toArray();
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/23612794#comment66459600_23612794
- >исключить ? Это приведет к тому, что метод не будет разрешен.
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/23612794#comment68916326_23612794
@Leon приведенная выше модельная функция scopeExclude()называется так. Читать о том, что Laravel области laravel.com/docs/5.3/eloquent#local-scopes
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/23612794#comment74097049_23612794
Этот метод не работает при цепочке с нетерпеливой загрузкой отношений : сама модель возвращает правильный столбец без исключенных, но отношения не извлекаются.
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/23612794#comment74151910_23612794
Я не уверен, что понимаю вашу проблему, но в большинстве случаев, если связь не может быть восстановлена, вы не выбираете первичный ключ в самой модели. Таким образом, если это столбец id, не исключайте его, потому что Laravel использует его внутренне для сопоставления.
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/23612794#comment96475248_23612794
$this - > столбцы, похоже, больше не работают, возвращает null
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/23612794#comment96480503_23612794
@Notflip он по-прежнему работает на Laravel5.7 php7.3, убедитесь, что вы не перезаписываете свойство $columns
vuhung3990

12.02.2017 09:26:27

вы можете использовать hiddenмассив, как это:

class Promotion extends Model
{
    protected $table = 'promotion';
    protected $hidden = array('id');
}
Christhofer Natalius

10.05.2017 09:32:47

Я не знаю о предыдущей версии Laravel, но в 5.4 вы можете поместить эту строку в пользовательскую модель

protected $hidden = ['pseudo', 'email', 'age', 'created_at'];

а затем User::find(1);вернет все поля , кроме pseudo, email, ageи created_at.

Но вы все равно можете получить эти скрытые поля с помощью:

$user = User::find(1);
$email = $user['email']; // or $user->email;
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/43885078#comment84352849_43885078
также доступен в Laravel 5.1
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/43885078#comment93280386_43885078
Он скрывает его от вывода (toArray (), toJSON ()), но все равно загружает его из БД, поэтому этот подход бесполезен, когда вам не нужно загружать определенные данные
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/43885078#comment94448306_43885078
@Stalinko если у вас есть определенные данные в модели, которую вы не хотите загружать вообще по умолчанию, похоже, что вы должны разделить ресурсы и использовать отношения.
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/43885078#comment94448872_43885078
@КБ, я не соглашусь. Разделение ресурсов и использование связей-это очень сложное решение, только для самых сложных случаев. В реальной жизни это довольно распространенная задача, чтобы загрузить только в настоящее время необходимые столбцы. Например, может быть тяжелый столбец описания, который необходим только при загрузке одной модели, но не необходим при загрузке всех моделей. Пропуск его экономит много памяти.
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/43885078#comment94476706_43885078
@Stalinko я только частично согласен с этим. Я понимаю вашу точку зрения, но я чувствую, что это ответственность коллекции, чтобы ограничить набор данных, где вам нужно обработать много его/есть вычислительные ресурсы, чтобы сэкономить только с помощью определенных полей. Модель должна быть предсказуемой и атомарной, и для особых случаев, когда она все еще нужна, есть много способов фильтровать объект/загружать его прямыми запросами/строителями. Если у вас есть [esp large] поля данных в ваших моделях, которые вы часто не хотите загружать, вероятно, они должны быть в отдельной модели.
Rafael Xavier

01.11.2017 07:30:09

Мы получаем объект eloquent из модели, заполненной всеми полями, преобразуем его в массив и помещаем его в коллекцию. Затем мы получаем все поля, кроме всех полей, указанных в массиве $fields.

$fields = ['a', 'b', 'c', 'N'];
$object = Model::find($id);
return collect($object->toArray())->except($fields);

Более четко, давайте приведем пример:

// Array of fields you want to remove
$fields_to_remove = ['age', 'birthday', 'address'];

// Get the result of database
$user = User::find($id);

// Transform user object to array
$user = $user->toArray();

// Create a collection with the user inside
$collection = collect($user);

// Get all fields of our collection except these fields we don't want
$result = $collection->except($fields_to_remove);

// Return
return $result;

Этот пример выше делает точно то же самое с первым, но он более объяснен.

sajed zarrinpour

25.09.2018 04:14:40

использование hiddenмассива в модели хорошо, но если вы не хотите скрывать свой столбец все время и использовать makeVisibleдля доступа к ним в случае необходимости, то вместо этого скройте свой столбец от сериализации, где вам нужно, с makeHiddenфункции makeHidden, подобной этой :

$res = Model::where('your query')->get();
$res->makeHidden(['column_one','column_two','column_n']);
return response()->json($res);
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/52499101#comment97576662_52499101
недооценить ответ
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/52499101#comment99147125_52499101
Это не полезно, если этот столбец большой, вы все равно будете запрашивать его, идея не в том, чтобы запрашивать его. У меня есть таблица со столбцом, который является геометрией фигуры, каждое значение похоже на 500 КБ, я должен вызвать как 100 объектов этой модели, мне нужно exceptего в своем запросе.
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/52499101#comment99445989_52499101
В зависимости от использования, мне нужно скрыть created_at, updated_at, deleted_at, этот ответ является наиболее идеальным для меня.
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/52499101#comment100180755_52499101
Это тот ответ, который мне нужен. Спасибо!
https://stackoverflow.com/questions/23612221/how-to-exclude-certains-columns-while-using-eloquent/52499101#comment100807386_52499101
Этот ответ лучше всего подходит, если вы хотите, например, скрыть одно поле от сериализации.
Manojkiran.A

03.06.2019 01:50:22

Я посмотрел в ответ на @Razor

Но есть очень простой способ, пропуская свойство $columns

/**
     * Scope a query to only exclude specific Columns
     *
     * @param  \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeExclude($query, ...$columns) 
    {
        return $query->select( array_diff( $this->getTableColumns(),$columns) );
    }

    /**
     * Shows All the columns of the Corresponding Table of Model
     *
     * @author Manojkiran.A <manojkiran10031998@gmail.com>
     * If You need to get all the Columns of the Model Table.
     * Useful while including the columns in search
     * @return array
     **/
    public function getTableColumns()
    {
        return $this->getConnection()->getSchemaBuilder()->getColumnListing($this->getTable());
    }

getTableColumns функция будет получить все столбцы таблицы, так что вам не нужно, чтобы определить

$свойства столбцов

Закрыть X