我是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 回答
这不是它的工作方式,再看一下Laravel docs中给出的例子
one-to-one
这里我们有两个模型之间的直接关系,例如,
User
和他的Phone
. 我知道在现实世界中并非如此..但这里有 only one of each on each side of the relationship . 所以:$user->phone
只返回一个项目,他的Phone
..$phone->user
将返回一个项目,电话的所有者(User
)我们有两个表
users
和phones
,由phones
表中的user_id
链接one-to-many
在这里,我们可以使用
User
和他的Post
的示例 . 在关系的一方,有一件事,另一方面可以有一件或多件 .$user->posts
将返回由User
制作的Post
的集合 .$post->user
将为他的任何一个Post
返回User
.但是,我们仍然只有2个表
users
和posts
,由posts
表中的user_id
链接 .many-to-many
接下来,现在我们可以 Build 一种关系,在每一方面,可以有不止一件事......让我们使用Laravel文档中的
User
和Role
的示例单个
User
,可以有任意数量的Role
,并且Role
可以出现在任意数量的User
上...现在我们有:$user->roles
将为User
显示Role
现在我们必须有3个表,
users
,roles
和role_user
,其中role_user
表包含user_id
和role_id
的映射 .如果你有
User
和Town
之间的第二个多对多关系,那么你还需要两个表,towns
和town_user
才能链接这两个模型 .现在,我认为这就是你对你的问题的看法,你可以把它们放在一起来绘制任意数量的模型之间的关系 . 这里是一个简单的例子,用于一些一对多和多对多的关系:
意思就是:
$user->posts
会给你一个User
的Post
$user->posts->tags
可以为您提供Tag
的集合,这些集合分配给用户已创建的Post
$role->users->posts
可以为您提供由User
和特定Role
制作的Post
的集合..等等等等!希望这更清楚了吗? :)