Как исключить определенные столбцы при использовании красноречивый
Когда я использую 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 и хорошего дня.




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

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();


scopeExclude()
называется так. Читать о том, что Laravel области laravel.com/docs/5.3/eloquent#local-scopes


id
, не исключайте его, потому что Laravel использует его внутренне для сопоставления.


$columns

12.02.2017 09:26:27
вы можете использовать hidden
массив, как это:
class Promotion extends Model
{
protected $table = 'promotion';
protected $hidden = array('id');
}

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;




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


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;
Этот пример выше делает точно то же самое с первым, но он более объяснен.

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


except
его в своем запросе.

created_at
, updated_at
, deleted_at
, этот ответ является наиболее идеальным для меня.



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 функция будет получить все столбцы таблицы, так что вам не нужно, чтобы определить
$свойства столбцов