我是Laravel的新手,我以前做过代码点火器的工作。我被雄辩的ORM概念迷住了。我有一个关于口才能力的一般性问题。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级吗?
数据库关系-itemtag(id,itemid,tagid) - tag(id) - tagtype(id,tagid,type id)- 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;模型
班级学生扩展口才{
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>";}
================
以上代码工作正常。
但是学生->角色->学生
不像预期的那样工作。如果我们能有一个工作代码来支持你的答案,那就太好了。
不过,还是谢谢你的解释。
发布于 2013-09-05 16:45:20
这并不完全是它的工作方式,再看看Laravel docs中给出的例子
一对一
这里我们有两个模型之间的直接关系,在这个例子中,User和his Phone。我知道现实世界不是这样..。但是这里有,在关系的每一方只有一个,。所以:
$user->phone只会返回一个项目,他的Phone。$phone->user将永远返回一个项目,手机的所有者(User)我们有两个表,users和phones,由phones表中的user_id链接
一对多
在这里,我们可以使用User和他的Post的例子。在关系的一方,有一件事,另一件事,可以有一个或多个项目。
$user->posts将返回由我们的User制作的Post的集合。$post->user将为他的任何一个Post返回User。但是,我们仍然只有两个表,users和posts,由posts表中的user_id链接。
many-to-many
从那以后,现在我们可以有一种关系,在每一方,可以有不止一件事.让我们使用Laravel中的Users和Roles的例子
单个User可以有任意数量的Role,Role可以出现在任意数量的User上。现在我们有:
$user->roles将显示该User的Roles。现在我们必须有3个表,users、roles和role_user,其中role_user表包含user_ids和role_ids的映射。
如果您在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');
}
}这意味着:
$user->posts会给你一个User的Post$user->posts->tags可以为您提供一个分配给用户创建的Posts的Tag集合。$role->users->posts可以为您提供一组由Users使用特定Role创建的Role集合。..and等等!希望这让事情更清楚了?)
https://stackoverflow.com/questions/18639188
复制相似问题