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

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

$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 и приятный день.

Ответы

Ответ 1

AFAIK не существует встроенной опции в 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();

Ответ 2

Я не знаю о предыдущей версии 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;

Ответ 3

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

$res = Model::where('your query')->get();
$res->makeHidden(['column_one','column_two');
return response()->json($res);

Ответ 4

вы можете использовать массив hidden следующим образом:

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

Ответ 5

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

$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;

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

Ответ 6

Я посмотрел на ответ @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 <[email protected]>
     * 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 получит все столбцы таблицы, поэтому вам не нужно определять

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