arkadaşlar bir proje için 3 modelim var ´orchestras´, ´musicsian´,´instrument´ orchestra create view şablonda orchestra üyeleri için satır ekleme işlemi yapıyorum ve js kullanıyorum. Örneğin;1 id li instrument 15 id li müzisyen gibi tabi satır ekleyerek bu böyle gidiyor. sorun şu sunucu tarafında birebir kayıt edilmesi gerekirken (eklenen instrumentte karşılık gelen muzisyen gibi) beceremediğim foreach döngüsün yüzünden heralde enstrumanlar sayıları kadar tük müzisyenlere atanıyor. Neyse aşağıda kodlar ve sql görsel var vaktiniz varsa inceleyin.
OrchestraController Store medhodu
public function store(Request $request)
{
try {
// Form verilerinin doğrulanması
$request->validate(
[
'name' => 'required|max:255',
'metakey' => 'max:255',
'metadesc' => 'max:255',
'availability' => 'required|in:1,0',
'type_orchestra_id' => 'required|max:255',
'image' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'musician_ids' => 'nullable|array',
],
[
'name.required' => 'İsim alanı zorunludur.',
'name.max' => 'İsim alanı maksimum :max karakter olabilir.',
'metakey.max' => 'Meta Anahtar alanı maksimum :max karakter olabilir.',
'metadesc.max' => 'Meta Açıklama alanı maksimum :max karakter olabilir.',
'availability.required' => 'Durum alanı zorunludur.',
'type_orchestra_id.required' => 'Türü alanı zorunludur.',
'availability.in' => 'Durum alanı aktif veya pasif seçilmelidir.',
'image.image' => 'Yüklenen dosya bir resim değil.',
'image.mimes' => 'Resim dosyasının uzantısı jpeg, png, jpg, gif veya svg olmalıdır.',
'image.max' => 'Resim dosyasının boyutu maksimum :max kilobayt olabilir.',
],
);
} catch (ValidationException $e) {
return redirect()
->back()
->withErrors($e->validator->errors())
->withInput();
}
// Müzisyen modelinin oluşturulması
$orchestra = new Orchestra();
$orchestra->name = $request->name;
$orchestra->slug = Str::slug(Str::limit($request->name, 100));
$orchestra->type_orchestra_id = $request->type_orchestra_id;
$orchestra->metakey = $request->metakey;
$orchestra->metadesc = $request->metadesc;
$orchestra->availability = $request->availability;
// Resim yüklemesi
if ($request->hasFile('image')) {
$image = $request->file('image');
$imageName = Str::slug($request->name) . '-' . uniqid() . '.' . $image->getClientOriginalExtension();
$destinationPath = public_path('images/orchestra');
$image->move($destinationPath, $imageName);
// Veritabanına resim yolu kaydediliyor
$orchestra->image_path = "images/orchestra/$imageName";
}
// Müzisyenin kaydedilmesi
$orchestra->save();
// Müzisyen ve Enstrüman ID'lerini al
$musicianIds = $request->input('musician_ids', []);
$instrumentIds = $request->input('instrument_ids', []);
// Hata kontrolü
if (empty($musicianIds)) {
return redirect()
->back()
->withErrors(['musician_ids' => 'Müzisyen seçimi yapılmadı.']);
}
// Ekstra sütun değerlerini içeren bir dizi oluştur
$attachments = [];
// 1. Aşama: Seçilen her müzisyen için seçili tüm enstrümanları ilişkilendirin
foreach ($musicianIds as $selectedMusicianId) {
foreach ($instrumentIds as $instrumentId) {
$attachments[] = [
'musician_id' => $selectedMusicianId,
'instrument_id' => $instrumentId,
'orchestra_id' => $orchestra->id,
];
}
}
// 2. Aşama: Javascript ile eklenen yeni müzisyenleri ve enstrümanlarını ilişkilendirin
$newMusicians = $request->input('new_musicians', []);
$newInstruments = $request->input('new_instruments', []);
foreach ($newMusicians as $musicianData) {
$musician = Musician::create($musicianData);
foreach ($newInstruments[$musician->id] as $instrumentId) {
$attachments[] = [
'musician_id' => $musician->id,
'instrument_id' => $instrumentId,
'orchestra_id' => $orchestra->id,
];
}
}
// Müzisyenleri ve enstrümanları ilişkilendirme
$orchestra->musicians()->attach($attachments);
// Başarı mesajı
session()->flash('success', 'Orkestra başarıyla kaydedildi.');
// Index sayfasına yönlendirme
return redirect()->route('orchestra.index');
}
orchestra view create _form şablonu
<div class="form-group row align-items-center mb-3">
<label class="col-lg-5 col-xl-3 control-label text-lg-end mb-0"></label>
<div class="col-lg-7 col-xl-6 control-label">
<div class="row">
<div class="col-sm-6">
<select name="instrument_ids[]" id="instrument_ids"
class="form-control instrument-select">
<option value="">Enstruman</option>
@foreach ($instruments as $instrument)
<option value="{{ $instrument->id }}"
{{ isset($orchestra) && $orchestra->instrument->contains($instrument->id) ? 'selected' : '' }}>
{{ $instrument->name }}</option>
@endforeach
</select>
</div>
<div class="col-sm-4">
<select name="musician_ids[]" id="musician_ids"
class="form-control musician-select">
<option value="">Sanatçı Seçiniz</option>
@foreach ($musicians as $musician)
<option value="{{ $musician->id }}"
{{ isset($orchestra) && $orchestra->musicians->contains($musician->id) ? 'selected' : '' }}>
{{ $musician->name }}</option>
@endforeach
</select>
</div>
<div class="col-sm-2">
<button type="button" class="btn btn-success btn-sm add-musician">
<i class="fas fa-plus"></i>
</button>
</div>
</div>
</div>
</div>
Js kodlarım
<script>
var musician_ids = [];
var instrument_ids = [];
function updateMusicianList() {
musician_ids = [];
// Yeni eklenen satır için sadece müzisyenleri güncelle
$('.musician-select').each(function() {
var selectedMusicianId = $(this).val();
if (selectedMusicianId !== '') {
musician_ids.push(selectedMusicianId);
}
});
}
function updateInstrumentList() {
instrument_ids = [];
// Yeni eklenen satır için sadece enstrümanları güncelle
$('.instrument-select').each(function() {
var selectedInstrumentId = $(this).val();
if (selectedInstrumentId !== '') {
instrument_ids.push(selectedInstrumentId);
}
});
}
// Müzisyenleri getiren fonksiyon
function getMusiciansForInstrument(selectedInstrumentId, musicianSelect) {
$.ajax({
url: '/get-musicians/' + selectedInstrumentId,
method: 'GET',
dataType: 'json',
success: function(data) {
musicianSelect.empty(); // Önceki optionları temizle
if (data.musicians.length > 0) {
$.each(data.musicians, function(index, musician) {
musicianSelect.append('<option value="' + musician.id + '">' + musician
.name + '</option>');
});
} else {
musicianSelect.append(
'<option value="">Enstrümana ait müzisyen bulunmamaktadır</option>');
}
},
error: function(error) {
console.error('Müzisyen çekme hatası:', error);
}
});
}
function showErrorMessages(messages) {
$('#error-messages').html(''); // Önceki mesajları temizle
$.each(messages, function(key, message) {
$('#error-messages').append('<div class="alert alert-danger">' + message + '</div>');
});
$('#error-messages').show();
}
$(document).ready(function() {
// Hata mesajları için bir alan ekleyin
$('body').append('<div id="error-messages"></div>');
// Yeni satır HTML'i
var newRowHtml = `
<div class="row">
<div class="col-sm-6">
<select name="instrument_ids[]" class="form-control instrument-select">
<option value="">Enstrüman Seçiniz</option>
@foreach ($instruments as $instrument)
<option value="{{ $instrument->id }}">{{ $instrument->name }}</option>
@endforeach
</select>
</div>
<div class="col-sm-4">
<select name="musician_ids[]" class="form-control musician-select">
<option value="">Sanatçı Seçiniz</option>
</select>
</div>
<div class="col-sm-2">
<button type="button" class="btn btn-success btn-sm add-musician">
<i class="fas fa-plus"></i>
</button>
<button type="button" class="btn btn-danger btn-sm remove-musician">
<i class="fas fa-minus"></i>
</button>
</div>
</div>
`;
// Satır Ekleme
$(document).on('click', '.add-musician', function() {
var currentRow = $(this).closest('.row');
// ... (Satır ekleme işlemini gerçekleştir)
currentRow.after(newRowHtml);
$(this).hide();
updateMusicianList();
updateInstrumentList();
});
// Satır Kaldırma
$(document).on('click', '.remove-musician', function() {
$(this).closest('.row').remove();
updateMusicianList();
updateInstrumentList();
});
// Hata mesajlarını yakala
@if ($errors->any())
showErrorMessages({!! json_encode($errors->all()) !!});
@endif
// Enstrüman seçildiğinde müzisyenleri güncelle
$(document).on('change', 'select[name^="instrument_ids"]', function() {
var selectedInstrumentId = $(this).val();
var musicianSelect = $(this).closest('.row').find('.musician-select');
getMusiciansForInstrument(selectedInstrumentId, musicianSelect);
updateMusicianList();
updateInstrumentList();
});
});
</script>
sql printscreen
[https://hizliresim.com/nkkigjw](https://)