当我使用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();
感谢您的未来回答,祝您度过愉快的一天。
答案 0 :(得分:38)
AFAIK SQL中没有构建选项来明确排除列,因此Laravel无法做到这一点。但您可以尝试this trick
<强>更新强>
另一个技巧是指定模型中的所有列
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();
答案 1 :(得分:28)
我不知道以前的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'];
答案 2 :(得分:12)
在模型中使用hidden
数组是好的,但是如果您不想一直隐藏列并使用 makeVisible
来访问需要的列,那么相反,您可以使用 makeHidden
这样的功能在需要的地方隐藏您的列:
$res = Model::where('your query')->get();
$res->makeHidden(['column_one','column_two');
return response()->json($res);
答案 3 :(得分:6)
您可以像这样使用hidden
数组:
class Promotion extends Model
{
protected $table = 'promotion';
protected $hidden = array('id');
}
答案 4 :(得分:5)
我们从模型中获得完全包含所有字段的对象,将其转换为数组,然后将其放入集合中。比我们获得除$ array中指定的所有字段之外的所有字段。
$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;
上面的这个例子与第一个例子完全相同,但它的解释更多。
答案 5 :(得分:0)
我已经调查了@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 函数将获取表的所有列,因此您无需定义
$列属性
答案 6 :(得分:0)
我有一个对我有用的解决方案,与已经说明的解决方案略有不同。
df = df.drop(df.columns[[1]], axis=1)
对我来说
$all_columns = Schema::getColumnListing('TABLE_NAME');
$exclude_columns = ['COLUMN_TO_EXCLUDE_1', 'COLUMN_TO_EXCLUDE_2'];
$get_columns = array_diff($all_columns, $exclude_columns);
return User::select($get_columns)->get();
因此,最后,我修改了Razor的解决方案,使其无需隐藏每种方法的任何列即可使用。
我希望这对某人有帮助! ?
答案 7 :(得分:-3)
您可以使用未设置的unset($category->created_at,$category->updated_at);
$fcategory = array();
$kCategory = KCategory::where("enabled", true)->get();
foreach ($kCategory as $category) {
$subkCategory = PostCategory::select("id", "name", "desc")
->where("id_kcategory", $category->id)
->where("enabled", true)
->get();
unset($category->created_at, $category->updated_at);
$fcategory[] = $category;
}