2013-09-05 109 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