Laravel 4 雄辩的能力

Posted

技术标签:

【中文标题】Laravel 4 雄辩的能力【英文标题】:Laravel 4 Eloquent Capabilities 【发布时间】:2013-09-09 10:57:47 【问题描述】:

我是 Laravel 的新手,我曾经在 codeigniter 上工作。 我对 Eloquent ORM 的概念很着迷。 我有一个关于 Eloquent 功能的一般性问题。 ORM的能力是什么,我的意思是我们可以在什么级别获得相关的表行。 如果你看“http://four.laravel.com/docs/eloquent#relationships

一对一 一对多 多对多 多态关系。

在我看来 “一对一”表示级别 1。table1 table2

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

[内部查找用户1及其帖子]

“Many To Many”表示2级。table1 table2 table3:

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

[内部查找用户1和他的帖子并找到帖子的cmet]

那么,我们可以将其扩展到 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;

型号

学生类扩展 Eloquent

public function roles()

    return $this->belongsToMany('Role', 'student_role');

class Role 扩展 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>";

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

以上代码运行良好

但是 $学生->角色->学生

没有按预期工作。 如果我们能有一个工作代码来支持您的回答,那就太好了。

不过还是谢谢你的解释。

【问题讨论】:

使用belongsToMany 的第二个参数,您需要传递用于建立连接的表的COLUMN...而不是表名 【参考方案1】:

这不是它的工作方式,再看看Laravel docs中给出的例子

一对一

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

$user-&gt;phone 只会退回一件物品,他的Phone.. $phone-&gt;user 将永远退回一件物品,电话的所有者 (User)

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

一对多

这里我们可以使用User和他的Posts的例子。关系的一方面是一件事,另一方面可以有 1 个或多个项目。

$user-&gt;posts 将返回由我们的User 制作的Posts 的集合。 $post-&gt;user 将为他的任何一个Posts 返回User

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

多对多

从那以后,现在我们可以建立一种关系,在每一边,可以有不止一件事......让我们使用 Laravel 文档中的 Users 和 Roles 的例子

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

$user-&gt;roles 将显示 Roles 对应的 User

现在我们必须有 3 个表,usersrolesrole_user,其中 role_user 表包含 user_ids 和 role_ids 的映射。

如果您在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-&gt;posts 会给你一个UserPost $user-&gt;posts-&gt;tags 可以为您提供Tags 的集合,这些Tags 分配给用户创建的Posts $role-&gt;users-&gt;posts 可以为您提供Posts 的集合,这些Users 带有特定的Role

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

【讨论】:

虽然我喜欢您的解释,但我无法将您所说的内容放入工作代码中。 好的,好吧..想想你想要做什么,尝试解决方案,然后用你的代码在这里发布你的努力! :) 然后我们可以看一下,给你一些指导。一旦你进入你的脑海,你会发现它很有意义!

以上是关于Laravel 4 雄辩的能力的主要内容,如果未能解决你的问题,请参考以下文章

雄辩的关系,模型的链接(Laravel 5.4)

Laravel 4,雄辩 - 语句和运算符之间

Laravel 4.2 雄辩的动态查询

laravel 4 - 如何限制(采取和跳过)雄辩的 ORM?

laravel 雄辩的关系 3 模型

Laravel 5.4雄辩的一对多关系