首页 文章

Laravel 4雄辩的能力

提问于
浏览
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;

楷模

class学生扩展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>";

}

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

以上代码工作正常

但是$ student-> roles-> students

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

但无论如何,谢谢你的解释 .

1 回答

  • 6

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

    one-to-one

    这里我们有两个模型之间的直接关系,例如, User 和他的 Phone . 我知道在现实世界中并非如此..但这里有 only one of each on each side of the relationship . 所以:

    • $user->phone 只返回一个项目,他的 Phone ..

    • $phone->user 将返回一个项目,电话的所有者( User

    我们有两个表 usersphones ,由 phones 表中的 user_id 链接

    one-to-many

    在这里,我们可以使用 User 和他的 Post 的示例 . 在关系的一方,有一件事,另一方面可以有一件或多件 .

    • $user->posts 将返回由 User 制作的 Post 的集合 .

    • $post->user 将为他的任何一个 Post 返回 User .

    但是,我们仍然只有2个表 usersposts ,由 posts 表中的 user_id 链接 .

    many-to-many

    接下来,现在我们可以 Build 一种关系,在每一方面,可以有不止一件事......让我们使用Laravel文档中的 UserRole 的示例

    单个 User ,可以有任意数量的 Role ,并且 Role 可以出现在任意数量的 User 上...现在我们有:

    • $user->roles 将为 User 显示 Role

    现在我们必须有3个表, usersrolesrole_user ,其中 role_user 表包含 user_idrole_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

    • $role->users->posts 可以为您提供由 User 和特定 Role 制作的 Post 的集合

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

相关问题