実現したいこと
上記画像のように右にある詳細ボタンをクリックしたらモーダルウインドウが出ます。
そのモーダルウインドウ内のテキストに詳細ボタンのあるテーブルの人物のデータを反映させたいです。
人物のデータ(名前・性別など)はcontactsテーブルにあります。
そのcontactsテーブルから取り出せるようにしたいです。
使用はlaravelのlivewireです。
発生している問題・分からないこと
上記画像のように、宮沢さんの詳細をクリックしたけど別の人物(田中さん)のデータでモーダルが開きました。
コードは下記で。
該当のソースコード
html(livewire.blade)
1<div> 2 <div class="buttons"> 3 <div class="export-btn"> 4 <button class="export">エクスポート</button> 5 </div> 6 <div class="paginate"> 7 {{ $contacts->links() }} 8 </div> 9 </div> 10 <div class="contacts"> 11 <table class="contacts__table"> 12 <tr class="table-heading"> 13 <th class="column">お名前</th> 14 <th class="column">性別</th> 15 <th class="column">メールアドレス</th> 16 <th class="column" colspan="2">お問い合わせ種類</th> 17 </tr> 18 @foreach($contacts as $contact) 19 <tr class="table-inner"> 20 <td class="name"> 21 {{ $contact['last_name'] }} 22 <span class="space"></span> 23 <span class="first">{{ $contact['first_name'] }}</span> 24 </td> 25 <td class="gender"> 26 <input type="hidden" value="{{ $contact['gender'] }}" /> 27 <?php 28 if ($contact['gender'] == '1') { 29 echo '男性'; 30 } elseif ($contact['gender'] == '2') { 31 echo '女性'; 32 } else { 33 echo 'その他'; 34 } 35 ?> 36 </td> 37 <td class="address"> 38 {{ $contact['email']}} 39 </td> 40 <td class="category"> 41 {{ $contact['category']['content']}} 42 </td> 43 <td class="detail-button"> 44 <button wire:click="openModal()" type="button" class="detail">詳細</button> 45 @if($showModal) 46 <div class="modal-wrapper"> 47 <div class="modal-window"> 48 <button wire:click="closeModal()" type="button" class="modal-close"> 49 × 50 </button> 51 <table class="modal__content"> 52 <tr class="modal-inner"> 53 <th class="modal-ttl">お名前</th> 54 <td class="modal-data"> 55 {{ $contact['last_name'] }} 56 <span class="space"></span> 57 <span class="firstName">{{ $contact['first_name'] }}</span> 58 </td> 59 </tr> 60 <tr class="modal-inner"> 61 <th class="modal-ttl">性別</th> 62 <td class="modal-data"> 63 <input type="hidden" value="{{ $contact['gender'] }}" /> 64 <?php 65 if ($contact['gender'] == '1') { 66 echo '男性'; 67 } elseif ($contact['gender'] == '2') { 68 echo '女性'; 69 } else { 70 echo 'その他'; 71 } 72 ?> 73 </td> 74 </tr> 75 <tr class="modal-inner"> 76 <th class="modal-ttl">メールアドレス</th> 77 <td class="modal-data">{{ $contact['email'] }}</td> 78 </tr> 79 <tr class="modal-inner"> 80 <th class="modal-ttl">電話番号</th> 81 <td class="modal-data">{{ $contact['tell'] }}</td> 82 </tr> 83 <tr class="modal-inner"> 84 <th class="modal-ttl">住所</th> 85 <td class="modal-data">{{ $contact['address'] }}</td> 86 </tr> 87 <tr class="modal-inner"> 88 <th class="modal-ttl">建物名</th> 89 <td class="modal-data">{{ $contact['building'] }}</td> 90 </tr> 91 <tr class="modal-inner"> 92 <th class="modal-ttl">お問い合わせの種類</th> 93 <td class="modal-data">{{ $contact['category']['content'] }}</td> 94 </tr> 95 <tr class="modal-inner"> 96 <th class="modal-ttl--last">お問い合わせ内容</th> 97 <td class="modal-data--last"> 98 {{ $contact['detail']}} 99 </td> 100 </tr> 101 </table> 102 <form class="delete-form" action="/delete" method="post"> 103 @method('delete') 104 @csrf 105 <input type="hidden" name="id" value="{{ $contact['id'] }}" /> 106 <button class="delete-btn">削除</button> 107 </form> 108 </div> 109 </div> 110 @endif 111 </td> 112 </tr> 113 @endforeach 114 </table> 115 </div> 116</div>
livewire.component
1<?php 2 3namespace App\Http\Livewire; 4 5use Livewire\Component; 6use Illuminate\Http\Request; 7use App\Models\Contact; 8use Livewire\WithPagination; 9 10class Modal extends Component 11{ 12 use WithPagination; 13 14 15 public $showModal = false; 16 17 protected $paginationTheme = 'bootstrap'; 18 19 public $contact; 20 21 22 public function render() 23 { 24 return view('livewire.modal',['contacts'=>Contact::with('category')->paginate(7)]); 25 } 26 27 28 public function openModal() 29 { 30 $this->showModal = true; 31 } 32 33 public function closeModal() 34 { 35 $this->showModal = false; 36 } 37} 38
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
laravel モーダルウインドウ データベース取得などで検索して色々試したが結果は解決してません。
以下のコートに変更、
(html / modal.blade.php)
<button wire:click="openModal({{ $contact->id }})" type="button" class="detail">詳細</button>
(livewire.component / Modal.php)
public function openModal($id)
{
$this->showModal = true;
$this->contact = Contact::with('category')->find($id); }
だが、結果は以下画像のとおり違うデータが反映されます。
他にforeachの繰り返し処理をモーダル部分につけてしたけど、データは同じデータは出るけどそれ以外のテーブルのデータも繰り返して出てきてだめでした。
補足
livewireでのデータの取り出し方がうまくいかないのでいい方法があれば返信をいただきたいです。
お願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/07/19 10:38
2024/07/20 14:51