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 ạ
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
Để 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
@TuanLinhChi $ungDungs = Ungdung::with(['quyens'])->get(); Bạn có thể viết thành dạng -> thay :: giùm mình được ko?
@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){
//........
}
}
}
@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);