【问题标题】:laravel4 one to one relationship can not load the relationshiplaravel4 一对一关系无法加载关系
【发布时间】:2013-10-29 16:57:31
【问题描述】:
  1. 我有两张这样的表:

用户

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"

是的,也是正确的对象,但是当代码转到代码三时,它给了我一个惊喜, 输出如下:

string(8) "GroupApi"

为什么它是 GroupApi 的实例,而不是 UsersGroupMember

的实例

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

欢迎任何想法,非常感谢。

【问题讨论】:

    标签: php orm laravel laravel-4


    【解决方案1】:

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

    另外,我猜 $g1 不是你建议的 GroupMember 对象,你能 getClass() 它并确认吗?

    【讨论】:

    • 谢谢,是的,$g1 不是 GroupMember 对象,我修改了我的问题。
    【解决方案2】:

    好吧,我猜你有 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,以遵循 eloquent 的约定。

    【讨论】:

    • 谢谢,这是一个拼写错误,我已经修改了我的表名。
    • 之后,我在这里删除了$this -> hasOne('Users', 'id')的id,我得到了错误。 Exception: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.group_member_id' in 'where clause' (SQL: select * from users` 其中users.group_member_id 为空限制 1) (Bindings: array ())`
    • 谢谢。还是得不到我想要的。我使用与您相同的代码,在 CODE THREE ,我仍然得到了结果:string(8) "GroupApi"
    • 还要查看文档中的此部分:laravel.com/docs/eloquent#relationships
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2011-03-30
    • 2013-01-17
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多