2013-09-05 78 views
2

我是Laravel新手,我曾经在codeigniter上工作过。 我迷恋于雄辩ORM的概念。 我有一个关于Eloquent能力的通用问题。 ORM的功能是什么,我的意思是什么级别,我们可以得到相关的表行。 如果你看一下“http://four.laravel.com/docs/eloquent#relationshipsLaravel 4雄辩能力

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

在我看来 ”一对一“ 方式级别1. table1 table2

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

[国内找到用户,并且他的职位]

“多对多”的意思等级2表1表2表3:

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

[国内找到用户1和他的岗位和发现的意见帖子]

那么,我们可以扩展到4个级别或5个级别。

数据库关系[项目(ID)-itemtag(ID,商品ID,标签识别) - 标记(ID) - tagtype(ID,标签识别,typeid的) - 型(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'); 
} 

}

类角色延伸锋{

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>"; 

}

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

上面的代码工作正常

但 $学生 - > roles->学生

不能按预期工作。 如果我们可以有一个工作代码来支持您的答案,那将会很棒。

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

+0

“belongsToMany”的第二个参数需要传递用于建立连接的表的COLUMN ...不是表名 – msturdy

回答

6

这并不完全它的工作方式,再看看在给出的例子中,Laravel docs

一到一个

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

  • $user->phone将只返回一个项目,他Phone ...
  • $phone->user会再回到一个项目时,手机的拥有者(User

我们有2个表,usersphones ,由user_id连接phones

一对多

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

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

但是,我们仍然只有2桌,usersposts,由user_idposts表链接。

许多一对多

从继,现在我们可以有一个关系,其中每边,可以有不止一件事...让我们使用的User S和Role的例子从Laravel文档

User S,可以有任意数量的Role S和A Role S可在任意数量的User小号出现......现在我们有:

  • $user->roles将显示Role■对于User

现在我们已经有3个表,usersrolesrole_user,其中role_user表包含user_id S和role_id s的映射。

如果你有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可以给你的被分配到Post s表示的用户已作出
  • $role->users->posts可以给你的由User s的特定Role

..和等所做的Post个集合Tag个集合等等!希望这更清楚了吗? :)

+0

虽然我喜欢你的解释,但我无法将你的在一个工作代码中说。 – user2125279

+1

好吧,好吧..想想你想做什么,尝试解决方案,然后在这里发布你的努力,用你的代码! :)然后,我们可以看看它,并给你一些指示。一旦你把它放到你的头上,你会发现它很有意义! – msturdy