웅변적인 관계 설명(예시 포함)

9944 단어 eloquentlaravel
제 생각에는 Eloquent은 라라벨의 가장 강력한 기능 중 하나입니다. 데이터베이스와 상호 작용하기 위한 API이며 매우 훌륭하고 기억하기 쉬운 구문을 가지고 있습니다. 예를 들어:

$post->author->name;


게시물 작성자의 이름을 알려드립니다.

이것은 Eloquent 관계의 예입니다. 관계는 모델(테이블)이 연결되는 방식을 정의합니다. 대부분은 이해하기 쉽지만 몇 가지 더 복잡한 것이 있습니다.

이 포스트에서, 나는 모든 관계가 어떻게 작동하는지 보여줄 것입니다.

일대일(하나 있음)



이 예에서는 UserAddress 의 두 가지 모델이 있습니다. User 모델은 이름, 이메일 주소 및 비밀번호와 같은 정보를 보유하고 Address 모델은 국가, 주, 도시 등과 같은 정보를 보유합니다.
  • AUser는 1개Address
  • AddressUser에 속한다

  • 다음과 같은 테이블 구조를 가질 수 있습니다.

    users
        id - integer
        name - string
        email - string
        password - string
    
    address
        id - integer
        country - string
        city - string
        user_id - integer
    


    이러한 관계를 다음과 같이 정의할 수 있습니다.

    // app/Models/User.php
    
    public function address()
    {
        return $this->hasOne(Address::class);
    }
    


    이제 $user->address->city 를 사용하여 사용자의 주소에 액세스할 수 있습니다.

    참고: 이것이 작동하려면 Address 모델에 user_id 열이 있어야 합니다.

    역(~에 속함)


    Address가 있고 해당하는 User를 찾으려면 다음 관계를 정의하십시오.

    // app/Models/Address.php
    
    public function user()
    {
        return $this->belongsTo(User::class);
    }
    


    일대다(많다)



    이 예에는 PostCategory 의 두 가지 모델이 있습니다.
  • APostCategory에 속한다
  • ACategory는 많다Post s

  • 그리고 우리는 다음과 같은 테이블 구조를 가지고 있습니다:

    categories
        id - integer
        name - string
    
    posts
        id - integer
        title - string
        category_id - integer
    


    이 관계를 다음과 같이 정의할 수 있습니다.

    // app/Models/Category.php
    
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
    


    다음과 같이 모든 게시물에 액세스할 수 있습니다.

    foreach($category->posts as $post) {
        //
    }
    


    참고: 이것이 작동하려면 Post 모델에 category_id 열이 있어야 합니다.

    다대일(소속)



    이 예에는 PostCategory 의 두 가지 모델이 있습니다.
  • APostCategory에 속한다
  • ACategory는 많다Post s

  • 그리고 우리는 다음과 같은 테이블 구조를 가지고 있습니다:

    categories
        id - integer
        name - string
    
    posts
        id - integer
        title - string
        category_id - integer
    


    이 관계를 다음과 같이 정의할 수 있습니다.

    // app/Models/Post.php
    
    public function category()
    {
        return $this->belongsTo(Category::class);
    }
    


    그리고 다음과 같이 Post 의 범주에 액세스할 수 있습니다.

    $post->category->name;
    


    통해 많은



    이 관계는 조금 더 어렵습니다. 이 예에는 Author , a Post , Language 의 세 가지 모델이 있습니다.
  • APostAuthor에 속한다
  • Author이 많다Post
  • An AuthorLanguage (언어를 구사)
  • 에 "소속"합니다
  • ALanguage는 많다Author s

  • 예를 들어 다음은 테이블 구조입니다.

    languages
        id - integer
        name - string
    
    authors
        id - integer
        name - string
        language_id - integer
    
    posts
        id - integer
        title - string
        author_id - integer
    


    특정 언어로 된 모든 게시물을 얻으려면 다음 관계를 정의할 수 있습니다.

    // app/Models/Language.php
    
    public function posts()
    {
        return $this->hasManyThrough(Post::class, User::class);
    }
    


    이제 다음을 사용하여 모든 게시물을 가져올 수 있습니다.

    foreach($language->posts as $post) {
        //
    }
    




    이제 LanguagePost 를 얻으려면 다음과 같이 하면 됩니다.

    $post->user->language->name;
    


    다대다(다수에게 속함)



    이 예에는 ProductTag 의 두 가지 모델이 있습니다.
  • AProduct는 많다Tag s
  • ATag는 많다Product s

  • 그리고 우리는 다음과 같은 테이블 구조를 가질 수 있습니다:

    products
        id - integer
        name - string
        price - integer
    
    tags
        id - integer
        name - string
    
    product_tag
        product_id - integer
        tag_id - integer
    


    참고: 테이블 구조에는 세 번째 테이블인 product_tag 가 있습니다. 이 테이블은 제품을 태그에 연결합니다.

    이제 다음과 같이 관계를 정의할 수 있습니다.

    // app/Models/Product.php
    
    public function tags()
    {
        return $this->belongsToMany(Tag::class);
    }
    



    // app/Models/Tag.php
    
    public function products()
    {
        return $this->belongsToMany(Product::class);
    }
    


    이제 다음을 사용하여 모든 태그/제품을 가져올 수 있습니다.

    foreach($product->tags as $tag) {
        //
    }
    



    foreach($tag->products as $product) {
        //
    }
    


    다음 포스팅에서는 다형성 관계가 무엇인지, 어떻게 사용하는지 보여드리겠습니다. 읽어 주셔서 감사합니다!

    좋은 웹페이지 즐겨찾기