Laravel có quan hệ không?

Phương thức Eloquent này kiểm tra xem khóa “myRelation” có tồn tại trong mảng quan hệ của mô hình Eloquent hay không. Nếu nó tồn tại, có nghĩa là các mối quan hệ thực đã được tải, nó trả về true, nếu không, nó trả về false

chữ ký chức năng

/**
 * Determine if the given relation is loaded.
 *
 * @param  string  $key
 * @return bool
 */
public function relationLoaded($key)
{

    return array_key_exists($key, $this->relations);

}


Phương pháp này đã mang lại lợi ích cho tôi như thế nào

Tóm lại, trong một trong những dự án của tôi, tôi có hai bảng nghệ nhân và sản phẩm trong đó nghệ nhân có Nhiều sản phẩm và sản phẩm thuộc về một nghệ nhân, như bạn có thể thấy bên dưới

người mẫu nghệ nhân

hasMany(Product::class);

    }


    //...
}

Dòng sản phẩm

belongsTo(Artisan::class);

    }


    //...
}

Bây giờ bất cứ khi nào tôi muốn tìm một nghệ nhân với các sản phẩm của anh ấy, tôi làm điều này

$artisan = Artisan::with(['products'])->get();

Trong dự án, mô hình Artisan có nhiều mối quan hệ hơn, nhưng để đơn giản, tôi sẽ chỉ giữ mối quan hệ products

Sau này, tôi thường thấy mình háo hức chỉ tải những sản phẩm đang hoạt động của nghệ nhân. Tôi phải thực hiện điều đó bằng cách chuyển một mảng mối quan hệ đến phương thức với trong đó khóa mảng là tên mối quan hệ (trong trường hợp của chúng tôi là sản phẩm) và giá trị mảng là một đóng cửa bổ sung thêm các ràng buộc cho truy vấn tải háo hức

$artisan = Artisan::with(['products' => function ($query) {

    $query->where('active', 1);

}])->get();

Vì vậy, tôi nghĩ có thể là một ý kiến ​​hay khi tạo mối quan hệ Sản phẩm đang hoạt động trong mô hình Nghệ nhân để làm cho mối quan hệ này đơn giản và rõ ràng hơn. Tôi cũng vậy

người mẫu nghệ nhân

hasMany(Product::class);

    }


    /**
     * "Active" products that belong to the artisan.
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function activeProducts()
    {

        return $this->products()->where('active', 1);

    }


    //...
}

Giờ đây, không cần phải chuyển mối quan hệ kết thúc đối với sản phẩm để tìm nạp các sản phẩm đang hoạt động của nghệ nhân, tôi có thể thực hiện điều tương tự chỉ với điều này

$artisan = Artisan::with(['activeProducts'])->get();

Cho đến bây giờ mọi thứ dường như diễn ra suôn sẻ, mã của chúng tôi đơn giản và rõ ràng. Vì vậy, quan hệ được tải ở đâu và khi nào có thể giúp ích gì cho chúng tôi

Hãy để tôi chia sẻ với bạn trường hợp sử dụng của tôi

Ở nhiều vị trí khác nhau của ứng dụng, có một phần mà tôi phải hiển thị một sản phẩm ngẫu nhiên cho một Nghệ nhân

$artisan->randomProduct();

Tùy thuộc vào Bộ điều khiển, đôi khi mối quan hệ háo hức được tải là sản phẩm và những lúc khác là mối quan hệ Sản phẩm đang hoạt động. Vì vậy, sự cần thiết phải biết mối quan hệ nào đã được tải lên đã làm tăng

Các mối quan hệ Eloquent của Laravel được định nghĩa là các phương thức trên các lớp mô hình Eloquent của bạn. Vì các mối quan hệ cũng đóng vai trò là trình tạo truy vấn mạnh mẽ, nên việc xác định các mối quan hệ dưới dạng phương thức cung cấp khả năng truy vấn và xâu chuỗi phương thức mạnh mẽ. Các mối quan hệ của Laravel có thể hơi khó hiểu. Nếu bạn chưa hiểu đầy đủ về cách các mối quan hệ trong Laravel hoạt động tại thời điểm này. Đừng lo lắng, Trong blog này, tôi đã thu thập một số mẹo và thủ thuật hữu ích về các mối quan hệ của mô hình laravel có thể hỗ trợ bạn nâng cấp quy trình phát triển web Laravel của mình

Phương pháp xây dựng truy vấn hùng biện mới // BEFORE: the foreign key is taken from the Post model $post->author_id === $user->id; // BEFORE: An additional request is made to get the User model from the Author relationship $post->author->is($user); // AFTER $post->author()->is($user); 2

Laravel

// BEFORE: the foreign key is taken from the Post model
$post->author_id === $user->id;

// BEFORE: An additional request is made to get the User model from the Author relationship
$post->author->is($user);

// AFTER
$post->author()->is($user);
3 xuất xưởng với một phương pháp xây dựng truy vấn mới cho
// BEFORE: the foreign key is taken from the Post model
$post->author_id === $user->id;

// BEFORE: An additional request is made to get the User model from the Author relationship
$post->author->is($user);

// AFTER
$post->author()->is($user);
2 Eloquent. Điều này cho phép bạn xóa tên khóa ngoại BelongsTo khỏi các truy vấn của mình và thay vào đó, sử dụng phương thức quan hệ làm nguồn thông tin xác thực duy nhất

// From:
$query->where('author_id', $author->id)

// To:
$query->whereBelongsTo($author)

// Easily add more advanced filtering:
Post::query()
    ->whereBelongsTo($author)
    ->whereBelongsTo($cateogry)
    ->whereBelongsTo($section)
    ->get();

// Specify a custom relationship:
$query->whereBelongsTo($author, 'author')

Phương pháp // BEFORE: the foreign key is taken from the Post model $post->author_id === $user->id; // BEFORE: An additional request is made to get the User model from the Author relationship $post->author->is($user); // AFTER $post->author()->is($user); 5 của mối quan hệ một đối một để so sánh các mô hình

Bây giờ chúng ta có thể so sánh giữa các mô hình liên quan mà không cần truy cập thêm cơ sở dữ liệu

________số 8_______

Sử dụng hasMany để tạo Nhiều

Nếu bạn có mối quan hệ

// BEFORE: the foreign key is taken from the Post model
$post->author_id === $user->id;

// BEFORE: An additional request is made to get the User model from the Author relationship
$post->author->is($user);

// AFTER
$post->author()->is($user);
6, bạn có thể sử dụng
// BEFORE: the foreign key is taken from the Post model
$post->author_id === $user->id;

// BEFORE: An additional request is made to get the User model from the Author relationship
$post->author->is($user);

// AFTER
$post->author()->is($user);
7 để lưu nhiều mục nhập "con" từ đối tượng "cha mẹ" của mình, tất cả trong một câu

$post = Post::find(1);
$post->comments()->saveMany([
    new Comment(['message' => 'First comment']),
    new Comment(['message' => 'Second comment']),
]);

Đang tải háo hức đa cấp

Trong Laravel, bạn có thể Eager Load nhiều cấp trong một câu lệnh, trong ví dụ này, chúng tôi không chỉ tải quan hệ tác giả mà còn quan hệ quốc gia trên mô hình tác giả

$users = App\Book::with('author.country')->get();

Háo hức tải với các cột chính xác

Bạn có thể thực hiện Laravel Eager Loading và chỉ định các cột chính xác mà bạn muốn nhận từ mối quan hệ

$users = App\Book::with('author:id,name')->get();

Bạn có thể làm điều đó ngay cả trong các mối quan hệ cấp hai, sâu sắc hơn

$users = App\Book::with('author.country:id,name')->get();

Truy vấn bộ lọc bổ sung về mối quan hệ

Nếu bạn muốn tải dữ liệu quan hệ, bạn có thể chỉ định một số giới hạn hoặc đơn đặt hàng trong hàm đóng. Ví dụ: nếu bạn muốn nhận các Quốc gia chỉ có ba thành phố lớn nhất của họ, thì đây là mã

$countries = Country::with(['cities' => function($query) {
    $query->orderBy('population', 'desc');
    $query->take(3);
}])->get();

Thay vì thuộc về, hãy sử dụng hasMany

Đối với mối quan hệ thuộc về, thay vì chuyển ID của cha mẹ khi tạo bản ghi con, hãy sử dụng mối quan hệ

// BEFORE: the foreign key is taken from the Post model
$post->author_id === $user->id;

// BEFORE: An additional request is made to get the User model from the Author relationship
$post->author->is($user);

// AFTER
$post->author()->is($user);
8 để tạo câu ngắn hơn

// if Post -> belongsTo(User), and User -> hasMany(Post)...
// Then instead of passing user_id...
Post::create([
    'user_id' => auth()->id(),
    'title' => request()->input('title'),
    'post_text' => request()->input('post_text'),
]);

// Do this
auth()->user()->posts()->create([
    'title' => request()->input('title'),
    'post_text' => request()->input('post_text'),
]);

Kết hợp hai "whereHas"

Trong Eloquent, bạn có thể kết hợp

// BEFORE: the foreign key is taken from the Post model
$post->author_id === $user->id;

// BEFORE: An additional request is made to get the User model from the Author relationship
$post->author->is($user);

// AFTER
$post->author()->is($user);
9và
$post = Post::find(1);
$post->comments()->saveMany([
    new Comment(['message' => 'First comment']),
    new Comment(['message' => 'Second comment']),
]);
0 trong một câu

User::whereHas('roles', function($query) {
    $query->where('id', 1);
})
->orDoesntHave('roles')
->get();

Kiểm tra xem Phương thức quan hệ có tồn tại không

Nếu tên mối quan hệ Eloquent của bạn là động và bạn cần kiểm tra xem mối quan hệ có tên như vậy có tồn tại trên đối tượng hay không, hãy sử dụng hàm PHP

$post = Post::find(1);
$post->comments()->saveMany([
    new Comment(['message' => 'First comment']),
    new Comment(['message' => 'Second comment']),
]);
1

$user = User::first();
if (method_exists($user, 'roles')) {
    // Do something with $user->roles()->...
}

Một cách ngắn hơn để viết whereHas

Phát hành trong Laravel

$post = Post::find(1);
$post->comments()->saveMany([
    new Comment(['message' => 'First comment']),
    new Comment(['message' => 'Second comment']),
]);
2. một cách ngắn hơn để viết
// BEFORE: the foreign key is taken from the Post model
$post->author_id === $user->id;

// BEFORE: An additional request is made to get the User model from the Author relationship
$post->author->is($user);

// AFTER
$post->author()->is($user);
9 với một điều kiện đơn giản bên trong

// BEFORE: the foreign key is taken from the Post model
$post->author_id === $user->id;

// BEFORE: An additional request is made to get the User model from the Author relationship
$post->author->is($user);

// AFTER
$post->author()->is($user);
0

Bạn có thể thêm điều kiện cho các mối quan hệ của mình

// BEFORE: the foreign key is taken from the Post model
$post->author_id === $user->id;

// BEFORE: An additional request is made to get the User model from the Author relationship
$post->author->is($user);

// AFTER
$post->author()->is($user);
1

Ghi chú

Tôi hy vọng rằng bằng cách làm theo các mẹo và thủ thuật này, bạn có thể cải thiện chất lượng và hiệu suất mã của mình cũng như cải thiện hành trình viết mã của mình. Nếu bạn là một doanh nghiệp và muốn tận dụng Laravel để phát triển ứng dụng web dựa trên PHP tiếp theo cho các yêu cầu tùy chỉnh của mình, bạn phải khám phá một nhóm tinh tế có trình độ về khuôn khổ Laravel. Vì vậy, Codebrisk sẵn sàng trợ giúp bạn với các yêu cầu phù hợp của bạn về Phát triển Laravel

Có một ý tưởng tuyệt vời? . com hoặc liên hệ với chúng tôi, nhân viên kinh doanh của chúng tôi sẽ liên hệ lại với bạn

Những loại quan hệ nào có sẵn trong Laravel eloquent?

Eloquent giúp việc quản lý và làm việc với các mối quan hệ này trở nên dễ dàng, đồng thời hỗ trợ nhiều loại mối quan hệ phổ biến. .
Một Đối Một
một đến nhiều
Nhiều nhiều
Có Một Thông Qua
Có Nhiều Thông Qua
Một Đối Một (Đa hình)
Một Đến Nhiều (Đa hình)
Nhiều Đến Nhiều (Đa hình)

Laravel triển khai mối quan hệ một đến nhiều như thế nào?

Tạo một mô hình LinkList
Tạo Migration cho LinkList Model
Cập nhật di chuyển liên kết
Cấu hình mối quan hệ Eloquent Model

Mối quan hệ nhiều với nhiều trong Laravel là gì?

Trong bảng category_product, bạn có thể thấy product_id 1 có nhiều mục với category_id 2 và 3. Đó là cách bạn có thể tạo nhiều mối quan hệ trong Laravel Eloquent. Rõ ràng là bạn có thể sử dụng nghịch đảo của mối quan hệ này để đính kèm một danh mục cho nhiều sản phẩm .

Tính đa hình trong Laravel là gì?

Ví dụ: trong một blog, các nhận xét có thể xuất hiện trên một bài đăng hoặc một trang nhưng vẫn giữ nguyên cấu trúc bất kể đó là một bài đăng hay một trang. This kind of behavior is described as polymorphism. In this article, we will go over polymorphic relationships in Laravel, how they work and the various use cases in which they are best used.