2

私はLaravelが初めてで、以前はcodeigniterに取り組んでいました。私は Eloquent ORM の概念に魅了されています。Eloquent の機能について一般的な質問があります。ORM の機能とは何ですか。つまり、関連するテーブル行をどのレベルまで取得できるかということです。「 http://four.laravel.com/docs/eloquent#relationshipsを見ると

  • 一対一
  • 一対多
  • 多対多
  • ポリモーフィックな関係。

私の意見では、「One To One」はレベル 1 を意味します。

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 extends 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>";

}

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

上記のコードは正常に動作します

しかし $student->roles->students

期待どおりに動作しません。あなたの答えをサポートする実用的なコードがあれば、それは素晴らしいことです.

しかし、とにかく説明をありがとう。

4

1 に答える 1

6

それはうまくいく方法ではありません.Laravelのドキュメントにある例をもう一度見てください.

一対一

ここでは、2 つのモデル間の直接的な関係があります。この例では、 aUserと hisPhoneです。現実の世界ではそうではないことはわかっています..しかし、ここでは、関係の両側にそれぞれ1つしかありません. そう:

  • $user->phone彼のPhone..
  • $phone->user電話の所有者 ( User)という 1 つのアイテムを返します。

2 つのテーブルがあり、テーブルusers内のでphonesリンクされていますuser_idphones

一対多

ここで、Userと 彼Postの の例を使用できます。関係の片側には 1 つのものがあり、もう一方には 1 つ以上の項目があります。

  • $user->postsPostによって作成された のコレクションを返しますUser
  • $post->userUserは、彼の のいずれかに対してを返しPostます。

ただし、テーブル内のでリンクされたusersとの2 つのテーブルしかありません。postsuser_idposts

多対多

それに続いて、それぞれの側に複数のものが存在できる関係を持つことができます... Laravel docs のUsers とs の例を使用しましょうRole

1 つのUser, には任意の数の を含めることができ、1 つのRolesは任意Roleの数の に表示できます。次のUserようになります。

  • $user->rolesRoleそのための sが表示されますUser

usersここで、rolesとの3 つのテーブルが必要です。テーブルにはとのマッピングが含まれていrole_userます。role_useruser_idrole_id

たとえば、 と の間に 2 番目の多対多の関係があるUser場合、これら 2 つのモデルをリンクできるようにするにはTown、さらに 2 つのテーブル と が必要にtownsなります。town_user

さて、これがあなたの質問で得ていたものだと思います.これらをまとめて、任意の数のモデル間の関係を描くことができます..これは、いくつかの1対多および多対多の関係の簡単な例です:

// 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ユーザーが作成したTagに割り当てられた のコレクションを提供できますPost
  • $role->users->posts特定の でPost作成されたのコレクションを提供できますUserRole

..などなど!それがより明確になったことを願っていますか?:)

于 2013-09-05T16:45:20.527 に答える