2016-10-13 23 views
10

Tôi tưởng tìm kiếm một chức năng nhưLaravel hùng biện Lazy Háo hức tải Đếm

load('relationship') 

nhưng mà tải một số trong cùng một cách

withCount('relationship') 

công trình để tải háo hức.

Tôi nghĩ nó sẽ được gọi là loadCount('relationship')

Trả lời

6

This solution hoạt động tuyệt vời cho tôi:

Tạo mối quan hệ hasOne mới trên mô hình có liên quan và thêm một lựa chọn liệu để truy vấn cho đếm. Ví dụ, nếu bạn muốn tải háo hức các số nhiệm vụ cho một người dùng nhất định, thêm video này vào User mẫu:

public function taskCount() 
{ 
    return $this->hasOne('App\Task') 
    ->selectRaw('user_id, count(*) as count) 
    ->groupBy('user_id'); 
} 

Và tải sau đó háo hức đếm như thế này:

$user = User::where('email', $email)->with('taskCount)->first(); 

Và truy cập số lượng như sau:

$taskCount = $user->task_count->count; 
+0

này đang tìm kiếm thực sự tốt và liên kết bạn cung cấp bao gồm thêm một Accessor tùy chỉnh mà làm cho nó thậm chí còn đơn giản hơn. Chỉ cần xác nhận rằng nó hoạt động với tải háo hức lười biếng và chúng tôi sẽ đi. – edlouth

+0

Sẽ tốt hơn nếu Laravel có chức năng này được xây dựng với Eloquent ... – fsasvari

+0

. Kiểm tra câu trả lời của tôi. – rzb

1

Vì Laravel 5.2, chức năng này được tích hợp sẵn.

Miễn là bạn có một mối quan hệ hasMany giữa Bưu chính, Comment, làm:

<?php 

$posts = App\Post::withCount('comments')->get(); 

foreach ($posts as $post) { 
    echo $post->comments_count; 
} 

Bạn có thể mối quan hệ tải thậm chí háo hức đếm theo mặc định bằng cách tuyên bố này trong mô hình của bạn:

<?php 

// Post model 

protected $withCount = ['comments']; 
+0

Điều này là tất cả sự thật, tuy nhiên tôi đang tìm kiếm tải háo hức lười biếng ([xem] (https://laravel.com/docs/5.5/eloquent-relationships#lazy-eager-loading)), tức là có thể tải một số sau khi mô hình đã được lấy ra. – edlouth

+0

Vâng, tôi không nghĩ câu trả lời được chấp nhận có phù hợp với bạn hay không. Mục đích của cách tiếp cận đó thực sự là giải quyết sự thật Eloquent không có phương thức 'withCount()' vào thời điểm đó, vì vậy bạn không thể tải * số lượng mong muốn. Đối với * tải chậm *, bạn sẽ vẫn phải lặp qua tập hợp các bài đăng và đếm các nhận xét cho mỗi đối tượng bài đăng. Nếu tất cả những gì bạn muốn là nhớ số đếm để tránh nhấn db nhiều lần cho cùng một bài đăng, một trình truy cập hùng hồn đơn giản hơn để lưu trữ giá trị vào một thuộc tính mô hình sẽ là đủ. Nhưng một lần nữa, bạn sẽ phải nhấn db ít nhất một lần cho mỗi bài đăng. – rzb

Các vấn đề liên quan