Saya memiliki model Eloquent yang memiliki model terkait:
public function option() {
return $this->hasOne('RepairOption', 'repair_item_id');
}
public function setOptionArrayAttribute($values)
{
$this->option->update($values);
}
Ketika saya membuat model, itu tidak harus memiliki model terkait. Ketika saya memperbaruinya, saya mungkin menambahkan opsi, atau tidak.
Jadi saya perlu memeriksa apakah model terkait ada, untuk memperbaruinya, atau membuatnya masing-masing:
$model = RepairItem::find($id);
if (Input::has('option')) {
if (<related_model_exists>) {
$option = new RepairOption(Input::get('option'));
$option->repairItem()->associate($model);
$option->save();
$model->fill(Input::except('option');
} else {
$model->update(Input::all());
}
};
Di mana <related_model_exists>
kode yang saya cari.
Jawaban:
Di php 7.2+ Anda tidak bisa menggunakan
count
objek relasi, jadi tidak ada metode satu-cocok-semua untuk semua relasi. Gunakan metode kueri sebagai ganti @tremby yang disediakan di bawah ini:solusi umum yang bekerja pada semua tipe relasi ( pre php 7.2 ):
Ini akan berfungsi untuk setiap relasi karena properti dinamis kembali
Model
atauCollection
. Keduanya menerapkanArrayAccess
.Jadi begini:
hubungan tunggal:
hasOne
/belongsTo
/morphTo
/morphOne
ke-banyak hubungan:
hasMany
/belongsToMany
/morphMany
/morphToMany
/morphedByMany
sumber
count($relation)
adalah solusi umum untuk semua hubungan. Ini akan bekerja untukModel
danCollection
, sementaraModel
tidak memiliki->count()
metode.Collection
memiliki metode sendiriisEmpty
, tetapiempty
fungsi generik mengembalikan false untuk objek (sehingga tidak akan berfungsi untuk koleksi kosong).count($model->relation)
tidak berfungsimorphTo
ketika hubungan belum memiliki hubungan yang ditetapkan. ID dan jenis asing adalah nol dan kueri db yang dibuat oleh Laravel adalah palsu dan muncul pengecualian. Saya digunakan$model->relation()->getOtherKey()
sebagai solusi.count(): Parameter must be an array or an object that implements Countable
Sebuah objek Hubungan melewati metode panggilan yang tidak dikenal melalui sebuah fasih permintaan Builder , yang dibentuk untuk hanya memilih obyek terkait. Itu Builder pada gilirannya melewati metode yang tidak diketahui panggilan melalui nya yang mendasari permintaan Builder .
Ini berarti Anda dapat menggunakan metode
exists()
ataucount()
langsung dari objek relasi:Perhatikan tanda kurung setelah
relation
:->relation()
adalah pemanggilan fungsi (mendapatkan objek relasi), yang berlawanan dengan->relation
yang ditetapkan pengambil properti sihir untuk Anda oleh Laravel (mendapatkan objek / objek terkait).Menggunakan
count
metode pada objek relasi (yaitu, menggunakan tanda kurung) akan jauh lebih cepat daripada melakukan$model->relation->count()
ataucount($model->relation)
(kecuali relasi telah dimuat dengan penuh semangat) karena menjalankan kueri hitung daripada menarik semua data untuk objek terkait dari basis data, hanya untuk menghitungnya. Demikian juga, menggunakanexists
tidak perlu menarik data model juga.Kedua
exists()
dancount()
bekerja pada semua jenis hubungan saya sudah mencoba, jadi setidaknyabelongsTo
,hasOne
,hasMany
, danbelongsToMany
.sumber
Saya lebih suka menggunakan
exists
metode:RepairItem::find($id)->option()->exists()
untuk memeriksa apakah model terkait ada atau tidak. Ini berfungsi dengan baik di Laravel 5.2
sumber
Setelah Php 7.1 , Jawaban yang diterima tidak akan berfungsi untuk semua jenis hubungan.
Karena tergantung dari jenis hubungannya, Eloquent akan mengembalikan a
Collection
, aModel
atauNull
. Dan dalam Php 7.1count(null)
akan melemparerror
.Jadi, untuk memeriksa apakah hubungan itu ada, Anda dapat menggunakan:
Untuk hubungan tunggal: Misalnya
hasOne
danbelongsTo
Untuk hubungan berganda: Sebagai Contoh:
hasMany
danbelongsToMany
sumber
Tidak yakin apakah ini telah berubah di Laravel 5, tetapi jawaban yang diterima menggunakan
count($data->$relation)
tidak berfungsi untuk saya, karena tindakan mengakses properti relasi menyebabkannya dimuat.Pada akhirnya, saya langsung
isset($data->$relation)
melakukan trik.sumber
$data->relation
tanpa$
(tidak dapat diedit, karena batas 6 karakter)$relation
akan menjadi nama hubungan Anda, seperti$data->posts
atau sejenisnya. Maaf jika itu membingungkan, saya ingin menjelaskan bahwarelation
itu bukan model properti yang konkret: PAnda dapat menggunakan metode relationLoaded pada objek model. Ini menyelamatkan daging saya jadi mudah-mudahan ini membantu orang lain. Saya diberi saran ini ketika saya mengajukan pertanyaan yang sama pada Laracasts.
sumber
Seperti yang sudah dikatakan Hemerson Varela di Php 7.1
count(null)
akan melemparerror
danhasOne
kembalinull
jika tidak ada baris. Karena Anda memilikihasOne
relasi, saya akan menggunakanempty
metode ini untuk memeriksa:Tapi ini berlebihan. Tidak perlu memeriksa apakah hubungannya ada, untuk menentukan apakah Anda harus melakukan
update
ataucreate
panggilan. Cukup gunakan metode updateOrCreate . Ini sama dengan di atas:sumber
Saya harus sepenuhnya memperbaiki kode saya ketika saya memperbarui versi PHP saya ke 7.2+ karena penggunaan fungsi count ($ x) yang buruk. Ini adalah rasa sakit yang nyata dan juga sangat menakutkan karena ada ratusan penggunaan, dalam skenario yang berbeda dan tidak ada aturan yang cocok untuk semua ..
Aturan yang saya ikuti untuk memperbaiki semuanya, contoh:
$ x = Auth :: user () -> posts-> find (6); (periksa apakah pengguna memiliki kiriman id = 6 menggunakan -> find ())
$ x = Auth :: user () -> profile-> department; (periksa apakah profil memiliki beberapa departemen, mungkin ada banyak departemen)
$ x = Auth :: user () -> profile-> get (); (periksa apakah pengguna memiliki profil setelah menggunakan -> get ())
Berharap ini dapat membantu, bahkan 5 tahun setelah pertanyaan diajukan, posting stackoverflow ini telah banyak membantu saya!
sumber