如何在使用eloquent时排除某些列

时间:2014-05-12 14:50:14

标签: php laravel eloquent

当我使用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();

感谢您的未来回答,祝您度过愉快的一天。

8 个答案:

答案 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);将返回除pseudoemailagecreated_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)

原因:

对我来说

  1. Razor's answer无法正常工作,因为出现以下错误:

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

  1. 然后,其余答案试图隐藏模型中的列。不幸的是,这将为我的类中的每个方法隐藏它们,而这不是我想要的。

因此,最后,我修改了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;
}