Laravel Eloquent ORM yang memiliki tabel tembus

Hai, saya punya masalah dengan Laravel di situs saya Pencarian nomor telepon. Saya mencoba memilih tempat yang memiliki kota yang saya pilih, melalui tabel kontak.

Kelas model saya: Kelas Tempat:

class Places extends Eloquent {
    public function contacts()
    {
        return $this->hasOne('Contacts');
    }
     public function clubs()
     {
        return $this->hasOne('Clubs');
     }    
}

Kelas kontak:

 class Contacts extends Eloquent {
     public function cities()
     {
         return $this->hasOne('Cities');
     }
   }

Kelas kota:

 class Cities extends Eloquent {

 }

Pertanyaan saya:

$view->clubs = Places::whereHas('contacts',function ($q) use($city_id){
           $q->where('contacts', function ($q) use($city_id){
               $q->where('id', $city_id);
            });
        })->get();

Pesan kesalahan:

Versi server MySQL untuk sintaks yang tepat untuk digunakan di dekat 'di mana id = ?)) >= 1' pada baris 1 (SQL: pilih * dari places di mana (pilih hitungan(*) dari contacts di mana contacts.places_id = places.id dan contacts = (pilih * dimana id = 2223)) >= 1)

Saya tahu itu hilang "dari" citites tetapi saya tidak tahu bagaimana mencapainya. Model hubungan


person Piotr Suchanek    schedule 07.08.2014    source sumber
comment
Suatu Tempat hanya memiliki satu kontak dan sebuah kontak hanya memiliki satu kota, oleh karena itu suatu tempat hanya memiliki satu kota, benarkah?   -  person RMcLeod    schedule 07.08.2014


Jawaban (3)


Anda memiliki 3 opsi menggunakan relasi:

1 solusi paling mudah:

Places::whereHas('contacts',function ($q) use ($city_id){
       $q->whereHas('cities', function ($q) use ($city_id){
           $q->where('id', $city_id);
        });
    })->get();

2 sama seperti di atas tetapi menggunakan PR ini: https://github.com/laravel/framework/pull/4954

Places::whereHas('contacts.cities', function ($q) use ($city_id){
        $q->where('id', $city_id);   
    })->get();

3 Menggunakan relasi hasManyThrough:

// Place model
public function cities()
{
  return $this->hasManyThrough('City', 'Contact');
}

// then
Places::whereHas('cities',function ($q) use ($city_id){
   $q->where('cities.id', $city_id);
})->get();

sunting

Dengan memiliki skema Anda, jelas bahwa tidak ada saran atau pengaturan awal Anda yang dapat berfungsi.

Ini adalah relasi banyak-ke-banyak yang dalam Eloquent adalah belongsToMany:

// Places model
public function cities()
{
  return $this->belongsToMany('Cities', 'contacts', 'places_id', 'cities_id')
    ->withPivot( .. contacts table fields that you need go here.. );
}

// Cities model
public function places()
{
  return $this->belongsToMany('Places', 'contacts', 'cities_id', 'places_id')
    ->withPivot( .. contacts table fields that you need go here.. );
}

Kemudian Anda dapat memanggil relasi seperti ini:

$city = Cities::first();
$city->places; // collection of Places models

// contacts data for a single city-place pair
$city->places->first()->pivot->open_hours; // or whatever you include in withPivot above

Sekarang, ada cara lain untuk mengaturnya, jika Anda juga memerlukan Contacts model itu sendiri:

// Places model
public function contact()
{
  return $this->hasOne('Contacts', 'places_id');
}

// Contacts model
public function city()
{
  return $this->belongsTo('Cities', 'cities_id');
}

public function place()
{
  return $this->belongsTo('Places', 'places_id');
}

// Cities model
public function contact()
{
  return $this->hasOne('Contacts', 'cities_id');
}

Kemudian:

$city = Cities::first();
$city->contact; // Contacts model
$city->contact->place; // Places model

hasManyThrough tidak akan berfungsi sama sekali di sini

person Jarek Tkaczyk    schedule 07.08.2014
comment
Saya mencoba melakukannya di awal seperti opsi 2 tetapi saya mendapatkan kesalahan ini: Panggilan ke metode yang tidak ditentukan Illuminate \ Database \ Query \ Builder :: contact.cities () Terlepas dari kenyataan bahwa saya memiliki fungsi kontak di kelas: kota fungsi publik (). Mengapa? - person Piotr Suchanek; 07.08.2014
comment
@PiotrSuchanek seperti yang saya tulis ini dapat dicapai dengan PR yang saya tautkan. Saat ini tidak didukung di Eloquent. Anda dapat menggunakan yang pertama untuk saat ini, atau menggunakan PR saya itu. - person Jarek Tkaczyk; 07.08.2014
comment
Hai, Saya mencoba kedua metode dan saya mendapatkan kesalahan serupa: Kolom tidak dikenal 'cities.contacts_id' di 'on klausa' (SQL: pilih * dari places di mana (pilih hitungan(*) dari cities gabung dalam contacts pada contacts.id = cities .contacts_id dimana places.id = contacts.places_id dan cities.id = 2223) ›= 1). Tabel Kota tidak memiliki kolom contact_id. Tabel Tempat memilikinya. Ada solusi? - person Piotr Suchanek; 08.08.2014
comment
Apa nama kunci asingnya? Anda memiliki nama model jamak yang tidak diharapkan oleh Eloquent. Itu sebabnya ia mencoba menebak kuncinya (karena Anda tidak menentukannya pada relasi) dan mencari contacts_id, sedangkan saya kira contact_id - person Jarek Tkaczyk; 08.08.2014
comment
Saya menambahkan ini: return $this-›hasManyThrough('Cities', 'Contacts', 'cities_id','contacts_id'); dan masih dan masih mendapatkan kesalahan yang sama. Saya juga menambahkan gambar di pertanyaan saya, yang dapat membantu. - person Piotr Suchanek; 08.08.2014
comment
Sobat, kamu punya hubungan m-m di sana! Ini adalah belongsToMany atau hasOne_+belongsTo jika Anda memerlukan model pivot. Periksa hasil editnya sebentar lagi - person Jarek Tkaczyk; 08.08.2014
comment
terima kasih kawan, kamu adalah penyelamat hidup. Pertahankan kerja bagus Anda - person ahmednawazbutt; 25.03.2021

Karena Anda mengetahui id kota dan dari sini Anda ingin menemukan tempat yang sesuai, Anda dapat memulai di kota dan kembali ke tempat itu. Untuk melakukan ini, Anda perlu mendefinisikan kebalikan dari hubungan Anda.

// Add this function to your Cities Model
public function contact()
{
    return $this->belongsTo('Contact');
}


// Add this function to your Contacts Model
public function place()
{
     return $this->belongsTo('Places');
}

Sekarang Anda dapat menanyakan Kota dan menemukan Tempat.

$place = Cities::find($city_id)->contact->place;

EDIT: Menambahkan fungsi pengembalian yang hilang

person RMcLeod    schedule 07.08.2014
comment
Saya mencoba ini dan mendapatkan kesalahan ini: Metode hubungan harus mengembalikan objek bertipe Illuminate\Database\Eloquent\Relations\Relation - person Piotr Suchanek; 07.08.2014
comment
Ini juga akan berfungsi dalam kasus Anda, namun ada return yang hilang dalam contoh @RMcLeod. Cukup tambahkan pernyataan return ke kedua metode dan itu akan berhasil - person Jarek Tkaczyk; 07.08.2014

person    schedule
comment
Jawaban ini akan sangat ditingkatkan jika Anda bisa menjelaskan bagaimana hal ini memecahkan masalah :) - person geisterfurz007; 10.07.2019