2013-07-31 33 views
9

Tôi đang sử dụng Laravel 4 và đặc biệt tôi đang tìm câu trả lời sử dụng ORO hùng hồn.Laravel: trả lại kết quả từ nhiều bảng có liên quan bằng cách sử dụng eloquent

Tôi có một bảng "nhiệm vụ" mà đựng một client_iduser_id gán cho mỗi hàng.

client_id đề cập đến một khách hàng trên cơ sở "khách hàng" bảng và user_id dùng để chỉ một người dùng trên một "người dùng" bảng.

Những gì tôi muốn làm: hiển thị tất cả các nhiệm vụ và hiển thị "khách hàng" tên và "người dùng" first_name

Vì vậy, kết quả sẽ trông như thế này trong tôi (lưỡi) chế độ xem:

@foreach($tasks as $task) 
    <tr> 
     <td>{{ $task->user->first_name }}</td> 
     <td>{{ $task->client->name }}</td> 
     <td>{{ $task->description }}</td> 
    </tr> 
@endforeach 

Chế độ xem trên chỉ ra $ task-> client-> name hoàn toàn tốt nhưng tiếc là hiển thị "T rying để có được tài sản của phi vật thể" khi tôi thêm dòng $ task-> user-> first_name

điều khiển của tôi trông như thế này:

$tasks = Task::with(array('user', 'client'))->get(); 
return View::make('index', compact('tasks')); 

Theo tôi được biết mô hình của tôi làm cho một sự khác biệt quá, nên mô hình của tôi trông như thế này:

class Task extends Eloquent { 
    protected $guarded = array(); 
    public static $rules = array(); 

    public function client() { 
     return $this->belongsTo('Client'); 
    } 

    public function user() { 
     return $this->belongsTo('User'); 
    } 
} 

Và:

class User extends Eloquent implements UserInterface, RemindableInterface { 
    public function task() 
    { 
     return $this->hasMany('Task'); 
    } 
} 

Và:

class Client extends Eloquent { 
    public function projects(){ 
     return $this->hasMany('Project', 'client_id'); 
    } 
} 

Bất kỳ ý tưởng nào về cách thực hiện công việc này? Tôi đã gãi đầu của tôi trong một thời gian - cũng lưu ý tôi không phải là một mối quan hệ cơ sở dữ liệu chuyên nghiệp nên đơn giản hơn những lời giải thích thì càng tốt :)

+0

Có vẻ như với tôi rằng bảng Nhiệm vụ của bạn là một pivot table trong một mối quan hệ nhiều-nhiều. Có lẽ bạn nên sử dụng phương thức isToany() của Eloquent để liên kết trực tiếp với Client và User. Xem [this] (http://laravel.com/docs/eloquent#working-with-pivot-tables) để biết thông tin về cách thêm các trường bổ sung vào bảng tổng hợp của bạn. – ciruvan

+0

Xin chào @cuewizchris Tôi đã xem tài liệu và tôi không thể tìm ra cách dịch ví dụ về Người dùng/Vai trò/Pivot theo nhu cầu của tôi. Bạn đang nói tôi nên thay đổi hasMany() của mình thành toMany()? Tôi hơi lạc mất ở đây. – Josh

Trả lời

2

Tôi chỉ làm việc thông qua điều này và học được khá nhiều điều bản thân mình. Những gì tôi đã làm là thiết lập mối quan hệ nhiều đến nhiều giữa usersclients và tạo bảng tổng hợp để xử lý mối quan hệ được gọi là tasks cũng lưu trữ mô tả cho từng tác vụ.

Đó là quá nhiều để gõ ở đây, nhưng bạn có thể kiểm tra mã của tôi tại http://paste.laravel.com/Fpv

+0

Thiên tài tuyệt đối. Cảm ơn bạn đây là chính xác những gì tôi đang tìm kiếm. Tuy nhiên (và tôi thừa nhận điều này nằm ngoài phạm vi câu hỏi của tôi) - nó thực sự phức tạp/ngắt khi bạn thử thêm pagination và/hoặc orderBy (ví dụ lệnh created_at DESC) vào truy vấn hùng hồn của bạn trong controller :) rõ ràng với orderBy created_at nó đang cố gắng để có được ngày created_at của người dùng không phải là ngày created_at của nhiệm vụ. – Josh

+0

Tôi đã thử một vài điều, nhưng nó luôn luôn có vẻ thất bại khi tôi cố gắng phân trang hoặc orderBy khi háo hức tải. Tôi giả sử cách tốt nhất để làm điều này sẽ là sử dụng array_slice cho paginate và bất cứ chức năng phân loại nào sẽ phù hợp với bạn. – user1669496

+6

Nó không bao giờ là "quá nhiều để gõ ở đây". Tôi không thể giải quyết liên kết của bạn. – DutGRIFF

0

Nhiều-nhiều mối quan hệ có thể được thực hiện như thế này với hùng biện:

class User extends Eloquent implements UserInterface, RemindableInterface { 
    public function client() 
    { 
     return $this->belongsToMany('Client', 'tasks', 'client_id')->withPivot('description'); 
    } 
} 

và mối quan hệ nghịch đảo ...

class Client extends Eloquent { 
    public function users() 
    { 
     return $this->belongsToMany('User', 'tasks', 'user_id'); 
    } 
} 

đã không được thử nghiệm này, nhưng nó phải là chính xác.

+0

Tôi xin lỗi vì thiếu kiến ​​thức và số lượng câu hỏi, nhưng truy vấn hùng hồn của tôi trông như thế nào trong bộ điều khiển của tôi? – Josh

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