忽略 select Laravel Eloquent 中的字段

Ignore field in select Laravel Eloquent

考虑这些模型:

飞行模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
  /**
   * The attributes that are mass assignable.
   *
   * @var array
   */
  protected $fillable =
  [
      'userID'
  ];    

  public function user()
  {
    return $this->belongsTo('App\User', 'userID');
  }
}

用户模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
  /**
   * The attributes that are mass assignable.
   *
   * @var array
   */
  protected $fillable =
  [
      'userID', 'username', 'address'
  ];    
}   

我想在尝试使用预先加载时跳过一列。我只想知道是否存在 IGNORE_FIELD FUNCTION 之类的东西,所以我可以这样做:

$flightUser = Flight::with(['user', function ($q)
{
    $q->ignoreField('user.address');
}])

我知道我可以将地址字段推送到 用户模型

中的隐藏数组中
protected $hidden = ['address'];

或者 $q->select('fields') 并且不包括地址字段,但我真正怀疑 laravel 是否具有我上面键入的功能。

注意

我知道一个领域没什么大不了的。但我的问题是我真实问题的简化版本。

我想我明白你的意思了。您可以更改 eloquent 关系,使其永远不会加载该字段。

class Flight extends Model {

    public function user()
    {
        return $this->belongsTo('App\User', 'userID')
            ->select(['userID', 'username']);
    }

}

因此该关系永远不会加载除用户 ID 和用户名之外的任何内容。如果你想区分,你甚至可以称完整的user()和有限的userName()

class Flight extends Model {

    public function user()
    {
        return $this->belongsTo('App\User', 'userID');
    }

    public function userName()
    {
        return $this->belongsTo('App\User', 'userID')
            ->select(['userID', 'username']);
    }

}