Asked Jul 26th, 12:04 PM 172 0 2
  • 172 0 2
+2

Xin hướng dẫn lấy dư liệu bảng phụ quan hệ nhiều nhiều trong Laravel cách tối ưu nhất ạ

Share
  • 172 0 2

Chào mọi người ạ. Hiện tại mình đang viết câu truy vấn lấy bảng phụ áp dụng Repository mà chưa biết lấy ntn. Mong mọi người chỉ giúp ạ.

  • Bảng chính: quyen, ungdung 1 Quyền có nhiều ứng dụng và 1 ứng dụng thuộc nhiều quyền.
  • Bảng phụ: quyen_ungdung. Mình hiện đang đứng ở bảng ungdung, viết hàm lấy bảng phụ pivot
public function getPivots($idQuyen, $idUngDung) {
        return $this->belongsToMany('App\Quyen', 'quyen_ungdung', 'quyen_fk', 'ungdung_fk');

    }

Cho mình hỏi và bây giờ bên bảng Reponsitory mình phải lấy ntn ??? Hiện tại do mình ko biết viết cách lấy ntn nên mình đành dùng cách cơ bản là select thẳng bảng phụ mà như vậy thì củ chuối quá @@

public function getTablePivot($idQuyen, $idUngDung) {
        return DB::table('quyen_ungdung')->where([
            ['quyen_fk', $idQuyen],
            ['ungdung_fk', $idUngDung]
        ])->get();

    }

Xong qua trang view mình làm code cực kì dài

@foreach($listUngDung as $ud)
    <tr class="text-center">
        <td>{{ $ungDung->getUngDungChaHD($ud->ungdung_fk)->ten }}
         </td>
         <td>{{ $ud->ten }}
             <input type="hidden" name="ungdung_fk[{{ $i }}]" value="{{ $ud->id }}">
         </td>
         <td><input type="checkbox" class="" name="hien_thi[{{ $i }}]" value="1" 
                                {{ (!empty($ungDung->getTablePivot($quyen->id, $ud->id)[0]) && $ungDung->getTablePivot($quyen->id, $ud->id)[0]->hien_thi == 1) ? "checked" : "" }} >
                            </td>
                            <td><input type="checkbox" name="tao_moi[{{ $i }}]" value="1" 
                                {{ (!empty($ungDung->getTablePivot($quyen->id, $ud->id)[0]) && $ungDung->getTablePivot($quyen->id, $ud->id)[0]->tao_moi == 1) ? "checked" : "" }} >
                            </td>
                            <td><input type="checkbox" name="cap_nhat[{{ $i }}]" value="1" 
                                {{ (!empty($ungDung->getTablePivot($quyen->id, $ud->id)[0]) && $ungDung->getTablePivot($quyen->id, $ud->id)[0]->cap_nhat == 1) ? "checked" : "" }} >
                            </td>
                            <td><input type="checkbox" name="xoa[{{ $i }}]" value="1" 
                                {{ (!empty($ungDung->getTablePivot($quyen->id, $ud->id)[0]) && $ungDung->getTablePivot($quyen->id, $ud->id)[0]->xoa == 1) ? "checked" : "" }} >
                            </td>
                            <td><input type="checkbox" name="xem_chi_tiet[{{ $i }}]" value="1" 
                                {{ (!empty($ungDung->getTablePivot($quyen->id, $ud->id)[0]) && $ungDung->getTablePivot($quyen->id, $ud->id)[0]->xem_chi_tiet == 1) ? "checked" : "" }} >
                            </td>
                            <td><input type="checkbox" name="duyet[{{ $i }}]" value="1" 
                                {{ (!empty($ungDung->getTablePivot($quyen->id, $ud->id)[0]) && $ungDung->getTablePivot($quyen->id, $ud->id)[0]->duyet == 1) ? "checked" : "" }} >
                            </td>
                            <td><input type="checkbox" name="bo_duyet[{{ $i }}]" value="1" 
                                {{ (!empty($ungDung->getTablePivot($quyen->id, $ud->id)[0]) && $ungDung->getTablePivot($quyen->id, $ud->id)[0]->bo_duyet == 1) ? "checked" : "" }} >
                            </td>
                            <td><input type="checkbox" name="xuat_excel[{{ $i }}]" value="1" 
                                {{ (!empty($ungDung->getTablePivot($quyen->id, $ud->id)[0]) && $ungDung->getTablePivot($quyen->id, $ud->id)[0]->xuat_excel == 1) ? "checked" : "" }} >
                            </td>

                        </tr>
                        @php $i++ @endphp
                        @endforeach

Controller của mình:

public function __construct(QuyenRepositoryInterface $quyen, UngDungRepositoryInterface $ud) {

        $this->quyen = $quyen;
        $this->ud = $ud;
        $this->modeDebug = config('app.debug');

    }

    public function __invoke(Request $request, $id)
    {
        $quyen = $this->quyen->find($id);
        $listUngDung = $this->ud->getUngDungConHD();
        $ungDung = $this->ud;

        $data = compact('listUngDung', 'ungDung', 'quyen');
        return view($this->getView(), $data);
    }

    private function getView() {
        return 'quyen.edit';
    }

Mong mọi người giúp đỡ cách lấy bảng phụ để code tối ưu tận dụng hết ưu thế của laravel ạ

2 ANSWERS


Answered Jul 27th, 2:22 AM
+2

Để lấy bảng phụ để code tối ưu tận dụng hết ưu thế của laravel bạn nên dùng relationship trong model. -Trong model UngDung tạo relationship:

public function quyens()
    {
        return $this->belongsToMany(Quyen::class);
    }

-Trong model Quyen tạo relationship:

public function ungDungs()
    {
        return $this->belongsToMany(UngDung::class);
    }

Sau đó gọi ra relationship bạn chỉ cần with mối quan hệ là được

https://laravel.com/docs/7.x/eloquent-relationships#eager-loading

vd: trong controller bạn gọi lấy hết ungDung và quyền của nó :

$ungDungs = Ungdung::with(['quyens'])->get();
$ungDungs->quyens
Share
Yoshin @nhoxhocju
Jul 27th, 5:55 AM

@TuanLinhChi $ungDungs = Ungdung::with(['quyens'])->get(); Bạn có thể viết thành dạng -> thay :: giùm mình được ko?

0
| Reply
Share
Nghiem Tuan @TuanLinhChi
Jul 27th, 10:38 AM
Rybak Alexander @KAITOKIDK10
Jul 30th, 3:42 AM

@nhoxhocju Trong model Quyen

public function quyens()
{
        return $this->belongsToMany('App\Quyen', 'quyen_ungdung', 'quyen_id', 'ungdung_id);
}

Trong eloquent hay controller:

$ungDungWithQuyen = $this->ungdung->with(['quyens'])->get();

Trong view:

foreach($ungDungWithQuyen as $ungDung){
    // ..........
    if($ungDung){
        foreach($ungDung->quyens as $quyen){
            //........
        }
    }
}
0
| Reply
Share
Answered Jul 29th, 3:32 AM
0

@nhoxhocju Nếu bạn muốn lấy danh sách Ứng Dụng và khi truy vấn thì lấy kèm luôn cả danh sách Quyền của ứng dụng đó, bạn có thể viết một trong các cách như này:

$ungDungs = Ungdung::with(['quyens'])->get();
$ungDungs = Ungdung::query()->with('quyens')->get();
$ungDungs = Ungdung::select(...)->where(...)->with('quyens')->get();

Nếu bạn đã truy vấn ra Ứng Dụng được lưu vào biến $ungDung hoặc có một danh sách lưu vào biến $ungDungs và bây giờ muốn lấy thêm Quyền của $ungDung hoặc $ungDungs thì bạn có thể dùng lệnh như này:

$ungDung->load('quyens');
$ungDungs->load('quyens');

dd($ungDung->quyens);
Share