Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyertai Tiga Jadual dengan Cekap dalam Laravel untuk Mendapatkan Siaran daripada Pengguna yang Diikuti?

Bagaimana untuk Menyertai Tiga Jadual dengan Cekap dalam Laravel untuk Mendapatkan Siaran daripada Pengguna yang Diikuti?

Linda Hamilton
Linda Hamiltonasal
2024-10-25 07:09:291031semak imbas

How to Efficiently Join Three Tables in Laravel to Retrieve Posts from Followed Users?

Laravel: Menyertai Tiga Jadual untuk Mendapatkan Data

Dalam senario ini, anda sedang membina aplikasi seperti Twitter di mana anda perlu memaparkan siaran daripada pengguna yang sedang pengguna mengikuti. Memandangkan anda mempunyai tiga jadual, iaitu Pengguna, Pengikut dan Perkongsian, memahami cara menyertainya dengan berkesan adalah penting untuk mendapatkan semula data yang diingini.

Matlamatnya adalah untuk mendapatkan semua Perkongsian di mana user_id daripada jadual Perkongsian sepadan dengan follower_id daripada jadual Pengikut dan user_id daripada jadual Pengikut sepadan dengan id daripada jadual Pengguna.

Menggunakan Pembina Pertanyaan Pangkalan Data

Anda cuba menggunakan pertanyaan berikut:

<code class="php">$shares = DB::table('shares')
    ->leftjoin('followers', 'shares.user_id', '=', 'followers.follower_id')
    ->leftjoin('users', 'followers.user_id', '=', 'users.id')
    ->where('users.id', 3)
    ->where('shares.user_id', 'followers.follower_id')
    ->get();</code>

Walau bagaimanapun, isu dengan pertanyaan ini adalah dalam syarat penyertaan untuk perkongsian dan pengikut. Cantuman yang betul hendaklah:

<code class="php">->leftjoin('followers', 'shares.user_id', '=', 'followers.user_id')</code>

Menggunakan Model untuk Kefungsian Dipertingkat

Daripada menggunakan pembina pertanyaan pangkalan data, disarankan untuk menggunakan model Laravel untuk pendekatan yang lebih berstruktur dan cekap terhadap operasi pangkalan data .

Begini cara model boleh ditakrifkan:

<code class="php">class User extends Model {
    public function shares() {
        return $this->hasMany('Share');
    }
    public function followers() {
        return $this->belongsToMany('User', 'follows', 'user_id', 'follower_id');
    }
    public function followees() {
        return $this->belongsToMany('User', 'follows', 'follower_id', 'user_id');
    }
}
class Share extends Model {
    public function user() {
        return $this->belongsTo('User');
    }
}</code>

Pelaksanaan Pertanyaan Menggunakan Model

Setelah model ditakrifkan, anda boleh melaksanakan pertanyaan seperti ini:

<code class="php">$my = User::find('my_id');

// Retrieves all shares by users that I follow
// eager loading the "owner" of the share
$shares = Share::with('user')
    ->join('follows', 'follows.user_id', '=', 'shares.user_id')
    ->where('follows.follower_id', '=', $my->id)
    ->get('shares.*'); // Notice the shares.* here

// prints the username of the person who shared something
foreach ($shares as $share) {
    echo $share->user->username;
}</code>

Dalam contoh ini, pertanyaan mendapatkan semula semua Perkongsian di mana user_id daripada jadual Kongsi sepadan dengan follower_id daripada jadual Pengikut dan user_id daripada jadual Pengikut sepadan dengan id pengguna semasa yang disimpan dalam pembolehubah $my.

Atas ialah kandungan terperinci Bagaimana untuk Menyertai Tiga Jadual dengan Cekap dalam Laravel untuk Mendapatkan Siaran daripada Pengguna yang Diikuti?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn