Laravel 4雄辩的能力

时间:2013-09-05 14:34:51

标签: orm laravel relational-database laravel-4 eloquent

我是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 Student扩展了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>";

}

=====

以上代码可以正常使用

但 $学生 - &GT; roles-&GT;学生

无法按预期工作。 如果我们能有一个可用的代码来支持你的答案,那就太好了。

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

1 个答案:

答案 0 :(得分:6)

这不是它的工作方式,再看一下Laravel docs

中给出的例子

<强>一个对一

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

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

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

<强>一个对多

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

  • $user->posts将返回由Post制作的User的集合。
  • $post->user将为User中的任何一个返回Post

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

<强>许多对多

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

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

  • $user->roles会显示Role
  • User

现在我们必须有3个表,usersrolesrole_user,其中role_user表包含user_id和{的映射{1}}秒。

如果您在role_idUser之间存在第二个多对多关系,那么您还需要另外两个表,Towntowns ,能够链接这两个模型。

现在,我认为这就是你对你的问题的看法,你可以将它们放在一起以绘制任意数量的模型之间的关系。这里是一个简单的例子,一对一和多对 - 很多关系:

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的{​​{1}}
  • User可以为您提供分配给用户创建的Post的{​​{1}}个集合
  • $user->posts->tags可以为您提供由TagPost制作的$role->users->postsPost的集合User

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