Laravel 4雄辩的能力

use*_*279 2 orm relational-database laravel eloquent laravel-4

我是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 
Run Code Online (Sandbox Code Playgroud)

[内部查找用户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;
Run Code Online (Sandbox Code Playgroud)

楷模

class学生扩展Eloquent {

public function roles()
{
    return $this->belongsToMany('Role', 'student_role');
}
Run Code Online (Sandbox Code Playgroud)

}

class Role extends Eloquent {

public function students()
{
    return $this->belongsToMany('Student', 'student_role');
}
Run Code Online (Sandbox Code Playgroud)

}

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>";
Run Code Online (Sandbox Code Playgroud)

}

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

以上代码工作正常

但是$ student-> roles-> students

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

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

mst*_*rdy 6

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

一到一个

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

  • $user->phone将只返回一个项目,他的Phone..
  • $phone->user将永远返回一个项目,电话的所有者(User)

我们有2个表,usersphones通过链接user_idphones

一个一对多

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

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

但是,我们仍然只有2个表,usersposts通过链接user_idposts表格.

许多一对多

接下来,现在我们可以建立一种关系,在每一方面,可以有不止一件事......让我们使用Laravel文档中Users和Roles的例子

单个User,可以有任意数量的Roles,Roles可以出现在任意数量的Users ...现在我们有:

  • $user->rolesRole为此展示sUser

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

如果您有之间,也就是说第二多对一对多的关系,User并且Town,那么你就需要两个表,towns并且town_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');
    }
}
Run Code Online (Sandbox Code Playgroud)

意思就是:

  • $user->posts会给你UserPost
  • $user->posts->tags可以给你一个Tag分配给Post用户所做的s 的集合
  • $role->users->posts可以给你一个PostUser特定的s 制作的s 的集合Role

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