忽略选择Laravel Eloquent中的字段

时间:2016-03-29 16:22:41

标签: php laravel laravel-5 eager-loading

考虑这些模型:

飞行模型

<?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是否具有类似我上面输入的功能。

注意

我知道一个领域并不是那么重要。但我的问题是我真正问题的简化版本。

1 个答案:

答案 0 :(得分:0)

我想我知道你得到了什么。您可以更改雄辩的关系,以便它永远不会加载该字段。

class Flight extends Model {

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

}

因此除了userID和username之外,关系永远不会加载任何内容。如果您想区分,您甚至可以拨打完整的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']);
    }

}