1. ホーム
  2. php

eloquentで特定のカラムを除外する方法

2023-10-27 21:39:45

質問

私はeloquentを使用しているとき、私は私のデータベースで私が選択したものを含むオブジェクトを埋めるために"where"メソッドを使用し、メソッド'get'を使用することができます。 私は意味します。

$users = User::where('gender', 'M')->where('is_active', 1)->get(['pseudo', 'email', 'age', 'created_at'])->toArray();

ここで、私は'疑似'、'email'などのように取得したいカラムを選択することができます。 しかし、私がlaravelのドキュメントで見逃しているのは、その逆を行う方法です。 それはそのようなものである可能性があります。

$users = User::where('gender', 'M')->where('is_active', 1)->notGet(['pseudo', 'email', 'age', 'created_at'])->toArray();

今後のご回答をよろしくお願いします。

どのように解決するのですか?

モデルの配列またはJSON表現から属性を隠す必要があるだけなら、1つまたは両方のアプローチを使用することができます。

  • を追加します。 $hidden プロパティをモデルに追加します。
    class User extends Model
    {
        /**
         * The attributes that should be hidden for arrays.
         */
         protected $hidden = ['password'];
    }
    
    
  • を使用します。 makeHidden 機能
    $users = $users->makeHidden(['address', 'phone_number']);
    
    

詳しくは他の回答をご覧ください... しかし 時には、アプリケーションに巨大なデータ(地理空間、HTML、ログ...)をロードしたくない、それは遅く、より多くのメモリを取るでしょう。OPはSQLクエリを求めたので私の答えになりましたが、ほとんどの場合、JSONレスポンスからデータのみを隠す方が便利です。


SQLにはカラムを明示的に除外するビルドインオプションがないため、Laravelではできません。しかし、次のことを試すことができます。 このトリック

更新

もうひとつのトリックは、モデル内のすべてのカラムを指定することです (または、追加のクエリを使用して、すべてのカラムを取得するために $this->getTableColumns() から この答え を追加し、各移行後にキャッシュして2回のクエリを回避することも可能です。 ローカルスコープ という機能を追加します。

// The below code requires you to define all columns in $columns.
// A better approach is to query the schema of the table and cache it after each  
// migration, for more details: https://stackoverflow.com/a/56425794/3192276

protected $columns = ['id','pseudo','email'];

public function scopeExclude($query, $value = []) 
{
    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();