Как исключить столбцы 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 получит все столбцы таблицы, поэтому вам не нужно определять
свойство столбца
Ответ 7
Попробуйте глобальные области применения Laravel:
https://laravel.com/docs/6.x/eloquent#query-scopes
Надеюсь, это поможет.