2

我是 Laravel 的新手,我曾经在 codeigniter 上工作。我对 Eloquent ORM 的概念很着迷。我有一个关于 Eloquent 功能的一般性问题。ORM的能力是什么,我的意思是我们可以在什么级别获得相关的表行。如果您查看“ http://four.laravel.com/docs/eloquent#relationships

  • 一对一
  • 一对多
  • 多对多
  • 多态关系。

在我看来,“一对一”意味着级别 1。 table1 table2

Example: User::find(1)->posts;

[内部查找用户1和他的帖子]

“多对多”表示级别 2。 table1 table2 table3:

Example: User::find(1)->postcomments 

[内部查找用户1和他的帖子并找到帖子的评论]

那么,我们能否将其扩展到 4 个级别或 5 个级别。

数据库关系[item(id) -itemtag(id, itemid, tagid) - tag(id) - tagtype(id, tagid, typeid) - type(id)]

谢谢

=================

关注帖子

虽然我喜欢 msturdy 的解释,但我无法让代码按照他解释的方式工作。

这是我的数据库表代码。

CREATE TABLE `roles` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `role` VARCHAR(45) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=4;


CREATE TABLE `students` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(45) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=5;


CREATE TABLE `student_role` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `student_id` INT(10) NULL DEFAULT NULL,
    `role_id` INT(10) NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `fk_student_role_1_idx` (`student_id`),
    INDEX `fk_student_role_2_idx` (`role_id`),
    CONSTRAINT `fk_student_role_1` FOREIGN KEY (`student_id`) REFERENCES `students` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
    CONSTRAINT `fk_student_role_2` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=6;

楷模

学生类扩展雄辩{

public function roles()
{
    return $this->belongsToMany('Role', 'student_role');
}

}

类角色扩展 Eloquent {

public function students()
{
    return $this->belongsToMany('Student', 'student_role');
}

}

Route::get('aaaas/{id}', function($id){

$student = Student::find($id);

$studentstr = print_r($student->toArray(), true);
print "<pre>student: $studentstr</pre>";

$roles = print_r($student->roles->toArray(), true);
print "<pre>role: $roles</pre>";

}

=================

上面的代码工作正常

但是 $student->roles->students

没有按预期工作。如果我们能有一个工作代码来支持您的答案,那就太好了。

但无论如何感谢您的解释。

4

1 回答 1

6

这不是它的工作方式,再看一下Laravel 文档中给出的示例

一对一

这里我们有两个模型之间的直接关系,在示例中为 aUser和 his Phone。我知道在现实世界中情况并非如此。但在这里,关系的每一方都只有一个。所以:

  • $user->phone只会退回一件物品,他的Phone..
  • $phone->user将永远退回一件物品,电话的所有者 ( User)

我们有 2 个表,users并且phones由表user_id中的链接phones

一对多

这里我们可以使用 theUser和 his Posts 的例子。关系的一方面是一件事,另一方面可以有一个或多个项目。

  • $user->postsPost将返回我们制作的 s的集合User
  • $post->user将返回User他的任何一个Post

但是,我们仍然只有 2 个表,users并且posts由表user_id中的链接posts

多对多

紧接着,现在我们可以建立一种关系,在每一边,可以有不止一件事......让我们使用Laravel 文档中的Users 和s 的例子Role

单个User, 可以有任意数量的Roles,并且Roles 可以出现在任意数量的Users 上……现在我们有了:

  • $user->rolesRole为此显示 sUser

现在我们必须有 3 个表,usersrolesrole_user其中role_user表包含user_ids 和role_ids 的映射。

如果您在 和 之间有第二个多对多关系UserTown那么您将需要另外两个表townstown_user才能链接这两个模型。

现在,我认为这就是您的问题所在,您可以将它们放在一起以绘制任意数量的模型之间的关系。这是一些一对多和多对多关系的简单示例:

// Our User model
class User extends Eloquent {

    // one-to-many with Post
    public function posts()
    {
        return $this->hasMany('Post');
    }

    // one-to-many with Role
    public function roles()
    {
        return $this->belongsToMany('Role');
    }
}

// Our Role model
class Role extends Eloquent {

    //many-to-many with User
    public function users()
    {
        return $this->belongsToMany('User');
    }

}

// Our Post model definition
class Post extends Eloquent {

    // one-to-many with User
    public function user()
    {
        return $this->belongsTo('User');
    }

    // many-to-many with Tag
    public function tags()
    {
        return $this->belongsToMany('Tag');
    }
}

// Our Tag model definition
class Tag extends Eloquent {

    // many-to-many with Post
    public function posts()
    {
        return $this->belongsToMany('Post');
    }
}

意思就是:

  • $user->posts会给你User一个Post
  • $user->posts->tags可以给你一个 s 的集合,这些Tags 被分配给Post用户创建的 s
  • $role->users->posts可以给你一个 s 的集合,这些Posts 是由Users 用特定的Role

..等等等等!希望这更清楚了吗?:)

于 2013-09-05T16:45:20.527 回答