laravel4一对一关系无法加载关系

时间:2013-10-21 09:17:26

标签: php orm laravel laravel-4

  1. 我有两张这样的表:
  2. 用户

    id      email
    1     abc@ibm.com
    2     abc@hp.com
    3     abc@google.com
    

    grp_members

    grp_id    user_id
    1          2
    2          2
    13         1
    13         3
    

    2.我的模特

    在那里,一个组成员必须是用户,因此它只是GroupMember的一对一关系。

    关于表用户的用户模型

    class Users extends Eloquent {
        protected $table = "users";
    }
    

    关于表group_members的GroupMember模型

    class GroupMember extends BaseModel{
    
        protected $table = "grp_members";
    
        public function user(){
            return $this -> hasOne('Users', 'id');
        }
    }
    

    3.在我的服务GroupApi.php中,如果我有这样的查询

    class GroupApi {
    
        public function queryGroupMembers(){
    
            $result = GroupMember::all();
    
            var_dump(get_class(GroupMember::all())); //CODE ONE
    
            foreach($result as $ret){
                var_dump(get_class($ret));  //CODE TWO
                var_dump(get_class($ret -> user));  //CODE THREE
            }
        }
    }
    

    如您所见,当我在 CODE ONE 中调用var_dump(get_class(GroupMember::all()))时, 我得到了这个

    .string(39) "Illuminate\Database\Eloquent\Collection"
    

    是的,这就是我想要的。

    现在,在 CODE TWO 时,会打印

    string(11) "GroupMember"
    

    是的,也是正确的对象,但当代码转到 CODE THREE 时,它给了我一个惊喜, 像这样的输出:

    string(8) "GroupApi"
    

    为什么是GroupApi的实例,而不是 Users GroupMember的实例

    在这种情况下,我该如何调用$ret -> user

    非常感谢任何想法。

2 个答案:

答案 0 :(得分:0)

有些事情我不确定我在你的实现中理解但是可能导致你麻烦的事情不是使用conventions Laravel asks for,即使用User作为模型名称和用户(model + s)作为表名。

另外,我猜你的g1不是你建议的GroupMember对象,你可以得到它(并且确认吗?)

答案 1 :(得分:0)

好的,我猜你有3张桌子:

用户; grp_members;组

以及使用表grp_members作为数据透视表的用户和组之间的多对多关系。

在这种情况下,试试这个:

班级用户:

class User extends Eloquent {

    public function groups()
    {
        return $this->belongsToMany('Group', 'grp_members');
    }

}

班组:

class Group extends Eloquent {

    public function users()
    {
        return $this->belongsToMany('User','grp_members');
    }

}

并且还将表'grp_members'中的字段名称从grp_id更改为group_id,以遵循雄辩的约定。