Yêu cầu thg 7 26, 2020 12:04 CH 233 0 2
  • 233 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 ạ

Chia sẻ
  • 233 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 CÂU TRẢ LỜI


Đã trả lời thg 7 27, 2020 2:22 SA
+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
Chia sẻ
Avatar Yoshin @nhoxhocju
thg 7 27, 2020 5:55 SA

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

Avatar Tun Tun @TuanLinhChi
thg 7 27, 2020 10:38 SA
Avatar Rybak Alexander @KAITOKIDK10
thg 7 30, 2020 3:42 SA

@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){
            //........
        }
    }
}
Đã trả lời thg 7 29, 2020 3:32 SA
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);
Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí