質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Livewire

Livewireは、JavaScriptを記述することなくPHPのみで動的コンポーネントを作成できるライブラリです。Bladeの構文をそのまま使用できるため、Laravelとの相性が良く、Vue.jsやReactよりシンプルに扱うことができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

2回答

1010閲覧

モーダルウインドウにデータベースのデータを指定して反映させたい

asuka.t

総合スコア0

Livewire

Livewireは、JavaScriptを記述することなくPHPのみで動的コンポーネントを作成できるライブラリです。Bladeの構文をそのまま使用できるため、Laravelとの相性が良く、Vue.jsやReactよりシンプルに扱うことができます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2024/07/19 05:31

実現したいこと

イメージ説明
上記画像のように右にある詳細ボタンをクリックしたらモーダルウインドウが出ます。
そのモーダルウインドウ内のテキストに詳細ボタンのあるテーブルの人物のデータを反映させたいです。
人物のデータ(名前・性別など)は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でのデータの取り出し方がうまくいかないのでいい方法があれば返信をいただきたいです。
お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ループ内で複数のmodalを設置してるのに表示の制御は$showModal一つだけなので全部のmodalが同時に変わっている。

まず、このmodalを@foreach($contacts as $contact)の外に置く。htmlの一番最後に移動でいい。

php

1@if($showModal) 2@endif

modal一つと制御する変数一つ$showModalだけにする。
後は質問の後半のやり方でいい。

php

1wire:click="openModal({{ $contact->id }})"

idを渡してmodal用のデータを更新してから表示。「modalを表示してからデータを更新」では見た目が悪い。こういう細かいところまで気をつけることが大事。

php

1public function openModal($id) 2{ 3 $this->contact = Contact::with('category')->find($id); 4 $this->showModal = true; 5}

投稿2024/07/19 06:13

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asuka.t

2024/07/19 10:38

回答ありがとうございます。試してみましたが解決できませんでした。 public function openModal($id) { $this->contact = Contact::with('category')->find($id); $this->showModal = true; } <button wire:click="openModal({{ $contact->id }})" type="button" class="detail">詳細</button> この場合どの辺りに原因がありそうでしょうか? モーダルの繰り返し表示は無くなりました。
asuka.t

2024/07/20 14:51

モーダル内のviewに渡す変数を1つずつ別のにしてコンポーネントを使いそれぞれ取り出す形にしたらできるようになりました。
guest

0

詳細ボタンにユーザーに紐づくidを渡して、モーダルを表示するときにapi経由でデータを再取得するとよいのでは?

投稿2024/07/19 05:39

yambejp

総合スコア116734

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asuka.t

2024/07/19 10:41

api経由とはフォームリクエスト送信も入りますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問