Laravel五大功能之Eloquent關係模式

Eloquent是Laravel的原始ActiveRecord是實現的,建立在Laravel的Fluent Query Builder之上的,所以Eloquent類和Fluent類是一樣的,能實現複雜的SQL語句和非常直觀表達出的表與表之間的關係

ActiveRecord也屬於ORM層,由Rails最早提出,遵循標準的ORM模型:表映射到記錄,記錄映射到對象,字段映射到對象屬性。配合遵循的命名和配置慣例,能夠很大程度的快速實現模型的操作,而且簡潔易懂。

ActiveRecord的主要思想是:

1. 每一個數據庫表對應創建一個類,類的每一個對象實例對應於數據庫中表的一行記錄;通常表的每個字段在類中都有相應的Field;
2. ActiveRecord同時負責把自己持久化,在ActiveRecord中封裝了對數據庫的訪問,即CURD;;
3. ActiveRecord是一種領域模型(Domain Model),封裝了部分業務邏輯;

現在我們講講ActiveRecord在Laravel中的應用

關於Eloquent的方法及其操作可以具體的可以看文檔,在這裏我們主要講解表的關係

一對一的關係(one-to-one relationship)
關係數據庫中兩個表之間的一種關係,該關係中第一個表中的單個行只可以與第二個表中的一個行相關,且第二個表中的一個行也只可以與第一個表中的一個行相關。
假如我們有一張user表和一張passport表是一對一的關係

首先讓我們來表達出這樣子的關係在我們的User類(用於操作user表)中
class User extends Eloquent
{
        public function passport()
        {
                return $this->has_one('Passport');//描述了在每一個用戶都有對應的passport
        }
}



如果我們想得到用戶id爲1的passport,我們應該怎麼做呢?
$user = User::find(1);//實例化User表
if(is_null($user))
{
        echo "No User found!";
        return;
}
if($user->passport)
{        
        //$user->passport將會得到$user對應的Passport實例,再來獲取number
        echo "The user's passport number is".$user->passport->number;
}


再來看看我們的Passport類(用於操作passport表)中,有一個外鍵user_id
class  Passport extends Eloquent
{
        public function user()
        {
                return $this->belongs_to('User');//這樣我們就表達出了user_id這個外鍵對應的是user表
        }
}

如果我們要通過一個passport來得到它所指向的用戶的名字
$passport = Passport::find(1);
echo $passport->user->name;

就是這麼簡單!laravel就是這麼方便!如果你用過其他的PHP框架的話,一定能感覺到的!


一對多關係(one-to-many relationships)
關係數據庫中兩個表之間的一種關係,該關係中第一個表中的單個行可以與第二個表中的一個或多個行相關,但第二個表中的一個行只可以與第一個表中的一個行相關。
假如我們有一張運動小組表,有運動員表許多的運動員,每一個運動員都屬於某一個小組

表team
class Team extends Eloquent
{
    public function palyers()
    {
        return $this->has_many(‘Player’);
    }
}

表players
class Player extends Eloquent
{
    public function team()
    {
        return $this->belongs_to('Team');
    }
}

接着咱們來看看改如何來得到一個小組的所有成員呢?
$team = Team::find(1);
$palyers = $team->palyers()->get();
foreach($players as $player)
{
        echo '$play->name is on team $team->name';
}

多對多關係(many-to-many relationships)
關係數據庫中兩個表之間的一種關係, 該關係中第一個表中的一個行可以與第二個表中的一個或多個行相關。第二個表中的一個行也可以與第一個表中的一個或多個行相關。要表示多對多關係,您必須創建第三個表,該表通常稱爲聯接表,它將多對多關係劃分爲兩個一對多關係。
假如有這樣子三張表

每個學生都可以任意的挑選課程,每門課程也可以有任意的學生來挑選
現在來看看我們怎麼定義Model
Student表的模型
class Student extends Eloquent
{
        public function courses()
        {
                return $this->has_many_and_belongs_to('Course');
        }
}

Course表的模型
class Course extends Eloquent
{
        public function students()
        {
                return $this->has_many_and_belongs_to('Student');
        }
}

讓我們來使用我們的模型,通過找到id爲1的學生選修的課程

$student = Student::find(1);

if(is_null($student))
{
        echo "沒有此學生";
        exit;
}

if(!$student->courses)
{
        echo "學生: $student->name 沒有選修任何課程。";
        exit;
}
else
{
        foreach($student->courses as $course)
        {
                echo "學生:$student->name 選修的課程有:$course->name";
        }
}

接着我們來通過課程找出他所對應的所有學生
$course = Course::find(1);
if(is_null($course))
{
        echo "沒有此課程";
        exit;
}
if($course->students)
{
        foreach($course->students as $student)
        {
                echo "該課程:$course->name選修的學生有:$student->name";
        }
}
else
{
        echo "課程暫時沒有學生選修!";
        exit;
}

如果我們想給一門沒有被選修的課程添加信息應該怎麼做呢?
$course = Course::find(12);
if(is_null($course))
{
        echo "該課程不存在!"
        exit;
}
$new_student = array(
        'name' => '沖田杏梨';
);

$course->students()->insert($new_student);

end!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章