orm - Laravel 4 Eloquent 能力

标签 orm laravel relational-database laravel-4 eloquent

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

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

在我看来 “一对一”表示级别1。table1 table2

示例:User::find(1)->posts;

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

"Many To Many"表示级别 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;

模型

类 Student 扩展 Eloquent {

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

class Role extends 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>";

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

上面的代码工作正常

但是 $学生->角色->学生

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

不过还是谢谢你的解释。

最佳答案

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

一对一

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

  • $user->phone只会退回一件商品,他的 Phone ..
  • $phone->user将永远归还一件元素,手机的所有者 ( User )

我们有 2 个表,usersphones , 由 user_id 链接在phones表格

一对多

这里我们可以使用 User 的例子和他的 Post秒。在关系的一侧,有一个事物,在另一侧可以有一个或多个项目。

  • $user->posts将返回 Post 的集合由我们的 User 制造.
  • $post->user将返回 User对于他的任何一个Post s.

但是,我们仍然只有 2 个表,usersposts , 由 user_id 链接在posts表。

多对多

在此基础上,现在我们可以建立一种关系,每一方都可以有不止一件事......让我们使用 User 的例子s 和 Role来自 Laravel 文档的 s

User , 可以有任意数量的 Role s 和一个 Role s 可以出现在任意数量的 User 上s...现在我们有:

  • $user->roles将显示 Role那个User

现在我们必须有 3 个表,users , rolesrole_user , 其中role_user表包含 user_id 的映射s 和 role_id

如果您之间有第二个多对多关系,比如说 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会给你一个UserPost
  • $user->posts->tags可以给你一组 Tag分配给 Post 的 s是用户所做的
  • $role->users->posts可以给你一组 PostUser 制作的具有特定的 Role

..等等等等!希望这让事情变得更清楚了吗? :)

关于orm - Laravel 4 Eloquent 能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18639188/

相关文章:

php - Carbon laravel 添加到文件名

redis - Redis 可以处理这个简单的查询吗

python - 检查具有 OneToOneField 的对象是新的还是已经存在

mysql - Symfony2 - 如何根据自定义查询获取实体对象?

mysql - 如何使用 readbean ORM 执行内连接、左连接?

c# - yield 是如何实现延迟加载的模式的?

php - 在 Ubuntu 20 中读取 Laravel 和 MySQL 中的 id 时出错

Laravel - 如何恢复本地存储符号链接(symbolic link)并刷新

mysql - 如何用2个表指定约束

MySQL关系数据库查询,术语正确吗?