Laravel Eloquent模型中奇怪的NULL情况

时间:2015-02-06 20:38:10

标签: php laravel model null eloquent

我使用Laravel面临一个非常奇怪的问题。

我有4个表(还有更多,但它们与问题无关):

platoons
- id
- game_id
- leader_id
- name

games
- id
- name
- icon

game_user_info_fields
- id
- game_id
- user_info_id

user_info_fields
- id
- name

这些表的模型包含以下关系方法:

class Platoon extends \Eloquent {
    public function game() {
        return $this->belongsTo('Game');
    }
}

class Game extends \Eloquent {
    protected $fillable = [];
    protected $table = 'games';

    public function fields() {
        return $this->hasMany('GameUserInfoField');
    }
}

class GameUserInfoField extends \Eloquent {
  protected $fillable = [];
  protected $table = 'game_user_info_fields';

  public function field() {
    return $this->belongsTo('UserInfoField');
  }

  public function game() {
    return $this->belongsTo('Game');
  }
}

class UserInfoField extends \Eloquent {
  protected $fillable = [];
  protected $table = 'user_info_fields';

  public function fields() {
    return $this->hasOne('GameUserInfoField');
  }
}

表格数据

platoons
id game_id leader_id name
1  1       1         Battlefield 4 
2  2       1         CS:GO
3  3       1         LoL
4  4       1         GTAV

games
id  name               icon
1   Battlefield 4      bf4.png
2   CS:GO              csgo.png
3   League of Legends  lol.png
4   GTA V              gtav.png

game_user_info_fields
id  game_id  user_info_field_id
1   1        1
2   1        2
3   2        3
4   3        4
5   4        5

user_info_fields
id  name
1   Origin username
2   Battlelog link
3   Steam ID
4   LoL username
5   Social club username

问题:

HLP :: pp()方法是一个助手,类似于函数 dd()

$platoon = Platoon::where('id', '=', Input::get('platoon_id'))->first();

foreach ($platoon->game->fields as $gameuserinfofield) {
    HLP::pp($gameuserinfofield->field);
}

返回 NULL ,当它返回 UserInfoField 模型时,

foreach ($platoon->game->fields as $gameuserinfofield) {
    HLP::pp($gameuserinfofield->game);
}

应该返回游戏模型。

他们都有相同的关系,只有不同的表格,所以我不知道它怎么能检索模型...

直接检索模型

UserInfoField::all();

确实会检索模型。

过去4个小时我一直坚持这个问题而无法修复它,请帮忙!

1 个答案:

答案 0 :(得分:1)

你的关系过于复杂。您可以简单地将它们指定为它。多对多的关系。这是使用belongsToMany()

完成的
public function fields(){
    return $this->belongsToMany('UserInfoField');
}

这种新关系使GameUserInfoField模型完全过时。