2014-06-30 14 views
6

Tôi có hai mô hình trong ứng dụng web Laravel 4.2 của mình, UserGroup. Người dùng có thể là thành viên của nhiều nhóm và một nhóm có thể có nhiều thành viên. do đó cả hai mô hình được nối với một mối quan hệ nhiều-nhiều:Laravel - Chọn các cột cụ thể trên các mối quan hệ nhiều-nhiều

<?php 
    class User extends Eloquent { 
     public function groups() 
     { 
      return $this->belongsToMany('Group'); 
     } 
    } 

    class Group extends Eloquent { 
     public function users() 
     { 
      return $this->belongsToMany('User'); 
     } 
    } 
?> 

Một trong những nguồn lực API của tôi là /groups, trong đó liệt kê tất cả các nhóm có sẵn trong ứng dụng:

<?php 
    $groups = Group::with('users')->all(); 
?> 

này hoạt động, tuy nhiên trong phản hồi JSON mà mỗi người dùng chứa tất cả các trường từ bảng users (ngoại trừ tất cả các trường trong thuộc tính $hidden). Tôi muốn mối quan hệ này chỉ trả lại một tập hợp các trường cụ thể thay vì toàn bộ bảng.

Trong loại mối quan hệ khác mà tôi có thể dễ dàng đạt được điều này với các tuyên bố sau (giả sử bây giờ mà người dùng có thể thuộc về một nhóm):

<?php 
    public function users() 
    { 
     return $this->hasMany('User')->select(['id', 'first_name', 'last_name']); 
    } 
?> 

Tuy nhiên, trên dường như không làm việc với nhiều-to- nhiều mối quan hệ. Tôi đi qua this question mà dường như đề cập đến cùng một vấn đề và có vẻ như điều này là không thể trong Laravel 4.1. Tác giả của câu trả lời được chọn, tptcat, cung cấp liên kết tới vấn đề trên trình theo dõi vấn đề Github của Laravel, nhưng liên kết không còn hoạt động nữa và tôi không thể xác định được sự cố này vẫn mở trong phiên bản 4.2.

Có ai đi qua điều này và quản lý thành công để giải quyết nó?

Trả lời

0

Phương thức all lấy một mảng tên cột làm tham số.

Nếu bạn nhìn vào nguồn, phải mất * (có nghĩa là mọi thứ) theo mặc định.

https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L624-L629

Bạn có thể vượt qua trong các cột mà bạn cần và nó sẽ trả lại kết quả chỉ với các cột cụ thể.

<?php 

$groups = Group::with('users')->all(array('first_column', 'third_column')); 
+0

Có, tính năng này không hoạt động. Tuy nhiên, nếu tôi thực hiện các truy vấn tương tự trong các hành động khác nhau trong bộ điều khiển của mình, tôi phải truyền cùng một mảng cho tất cả chúng. Tôi đang nhắm đến một giải pháp tương tự như những gì có thể được thực hiện với các loại mối quan hệ khác. – cafonso

+0

Bạn luôn có thể tạo một hàm thực hiện các truy vấn phổ biến này trong mô hình của bạn và gọi nó từ các hành động khác nhau trong bộ điều khiển của bạn. – Oni

0

Sử dụng như thế này.

<?php 
    class User extends Eloquent { 
     public function groups() 
     { 
      return $this->belongsToMany('Group')->select(array('id', 'name')); 
     } 
    } 

    class Group extends Eloquent { 
     public function users() 
     { 
      return $this->belongsToMany('User')->select(array('id', 'name')); 
     } 
    } 
?> 
Các vấn đề liên quan