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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1256閲覧

Ajaxで受け取ったテーブルの情報から時間比較をしたい。

kamille-mio

総合スコア24

Laravel

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2019/12/10 17:26

編集2019/12/12 00:52

過去の質問

日時と場所を指定する利用登録に関するテーブル定義とリレーションについて

Laravelにおいて外部キーを主キーとしているテーブルとで適切なリレーションができているかわからない。

Laravel歴1ヶ月弱です。
認証と基本のCRUDを学習してきて、現在、就活に向けて成果物を作るにあたって施設などの利用申請(予約申請)のシステムを簡単にしたものを制作しています。
これまでテーブルに関しては上記のような質問をさせていただきここまで進めてきています。

環境

Laravel 6.5.0
Homestead

質問したいこと

flatpickrなどのカレンダーライブラリを用いて、下記のアクティビティ図のような処理を想定した処理を書いているのですが、時間帯選択のフォームは最初表示されていない状態で施設名と日付をサーバーに送信したあとにアクティビティ図のような処理を適用したあとで、時間帯選択のフォームをフェードインのようなアニメーションで表示させたいと思い、Ajaxを使った処理を書いていたのですがJavascriptに慣れていないので、PHP側から帰ってきた後の処理を考えていたところ詰まってしまったため今回質問させていただきました。

具体的には他のユーザーがその日の施設の予約を取る際に、別のユーザーがすでに同日・同施設に予約を入れている場合、その時間帯を選択できないようにしたいので、取得してきた各予約情報の中から利用開始時間と利用終了時間を参照して、それを元に例えばflatpickrなら下記のminTimeやmaxTimeに設定する値を求めたいがその書き方がわからないといったといころです。

Javascript

1const config = { 2 enableTime: true, 3// フォームで選択できる時間の範囲を以下の通りにする 4 minTime: "16:00", 5 maxTime: "22:00" 6} 7flatpickr('.flatpickr', config);

処理がまだ定まってないのでまだviewを作っていないのですが
flatpickrなどのカレンダー・時刻選択のライブラリを使用したものを含めて

・施設名選択
・日付選択
(ここで一旦送信ボタンを押させてAjaxを発火させ、以下の2つのinputタグを表示するようにする)

・利用開始時間選択
・利用終了時間選択
(ここで送信ボタンを押させて、以下の通りで予約を確定しますか? というページへリダイレクトさせる)

と4つのinputタグを用意して、製作する予定です。
プログラミング歴も浅く、初めての製作なので、そもそもコードとかに間違いがあったり、処理的に問題がある場合は遠慮なく指摘していただけると助かります。
そのため、リーダブルとは言えないことを承知の上で、かなりコメントアウトを残したままのコードになっています。

質問に際してやったこと・作ったもの

####今回質問したい箇所に関わるアクティビティ図
今回質問したい箇所に関わるアクティビティ図

ER図

イメージ説明

JS側で書いているところ(途中)

Javascript

1// 利用する日付と施設名を選択して、submitボタンをonclickすると、ajax発火 2 3$(document).on("click", ".date-select", function() { 4 init_set_reservations(); 5 6 7}); 8 9 10// 1で発火したajaxでデータベースにアクセスして、テーブルから取得した日付の予約情報を取り出す。 11 12function init_set_reservations () { 13 14 const server_url = "http://localhost:8000/"; // 使用しているサーバーのURLを定義 15 16 17 // ajax通信、GETでフォームのデータを送信して、PHP側でデータベースからデータを取得するときの検索キーワードにする。 18 $.ajax({ 19 type:"GET", 20 url: server_url + "get-reservation.php"; 21 datatype:'json', 22 data:{ 23 date:$('#dateinfo').val(), // 日付選択のためのinputタグからの情報 24 facility_name:$('#facility_name').val() // 施設名選択のためのinputタグからの情報 25 26 } 27 }).done(function(data) { 28 29 30 /* 31 受け取った情報を元にminTimeとmaxtimeを算出する。 32 その後、フェードインで時間帯選択フォームを表示させる。(クラス切り替えでcssを切り替える) 33 時間の範囲はmintimeとmaxtime。 34 */ 35 36 // JSONをパースする(JSオブジェクトに変換) 37 38 let obj = {}; 39 let obj = Json.parse(data); 40 41 // JSオブジェクトを配列にして返し、さらにキーごとの配列を分ける。 42 let objlist = Object.entries(obj).map(([key, value]) => ({[key]: value})); 43 44 // 上記の配列からstart_timeとend_timeの値を取り出す。 45 46 let array_start_time = objlist.filter(function(value, start_time, thisArray) { 47 return array_start_time; 48 }); 49 50 let array_end_time = objlist.filter(function(value, end_time, thisArray) { 51 return array_start_time; 52 }); 53 54 /* 55 得られたstatt_timeを比較してminTimeを、end_timeでMaxTimeを算出したい。 56 57 */ 58 59 }).fail(function(jqXHR, textStatus, errorThrown ) { 60 $("#span1").text(jqXHR.status); 61 $("#span2").text(textStatus); 62 $("#span3").text(errorThrown); 63 64 }).always(function(){ 65 $("#span6").text("complete"); 66 67 }); 68} 69

php側の処理

php

1<?php 2 3// 試しに書いている状態なのでメソッド名などは仮置。modelとcontrollerに後で処理を分ける 4 5 6// Ajaxから送信されてきたデータは例としては下記のようになっていると想定 7 // $_GET['date'] = '2019-11-30'; 8 // $_GET['facility_name'] = '多目的室A'; 9 10 public function test(){ 11 12 if(isset($_GET['date']) && isset($_GET['facility_name'])) { 13 14 // セッションに保存されている情報を変数に代入。 15 16 $reservedates = $_GET['date']; 17 $facility_name = $_GET['facility_name']; 18 19 /*facility_nameからfacility_idを参照し、それを元に予約情報を抽出。さらに特定のカラムのレコードに絞ってそれを連想配列の形で取得する。 20 今回はstart_timeとend_timeを取得したい。 21 */ 22 23 $start_times = \App\Reserve::whereHas('Facility', function($query){ 24 $query->where('facility_name', $facility_name)->whereDate('start_time', $reservedates); 25 })->pluck('start_time','id'); 26 27 $end_times = \App\Reserve::whereHas('Facility', function($query){ 28 $query->where('facility_name', $facility_name)->whereDate('end_time', $reservedates); 29 })->pluck('end_time','id'); 30 31 /*しかし、上記のコードだとjson_encodeの際に困ったので、同じようにfacility_nameからfacility_idを参照し、それと指定された日時を元に予約情報を抽出。その中からid、start_time、end_timeのカラムの値をすべて取得し、配列にする。tinkerでのテストはこちらの関数を実行した。 32 where()系の第2引数は本番だと変数。 33 */ 34 35 $reserveinfo = \App\Reserve::whereHas('Facility', function($query){ 36 $query->where('facility_name', 'test1')->whereDate('start_time', '2019-11-30')->whereDate('end_time', '2019-11-30'); 37 })->select('id', 'start_time', 'end_time')->get()->all(); 38 39 /* 注釈 40 $array_reserveinfo = $reserveinfo->all(); // all()はCollectionのメソッドでクエリビルダとしてのget()とは違うので記述する場合はさらに別の変数にエスケープしたほうがいい? 41 42 */ 43 44 // 取得したデータを連想配列にしてJSONにしてAjaxに渡す(HTTPの処理なのでcontrollerに記述する) 45 46 $json = json_encode($reserveinfo, JSON_PRETTY_PRINT); 47 48 } else { 49 echo 'FAIL TO AJAX REQUEST'; 50 } 51 } 52}

PHPのコードをtinkerで試した結果

start_timeだけ取得する関数のテスト
イメージ説明

指定された日付の予約情報をすべて取得する関数のテスト
イメージ説明

追記

view

HTML

1<body> 2<div id="app"> 3 <div clas="container"> 4 <div class="row justify-content-center"> 5 <div class="col-md-8"> 6 <div class="card"> 7 <div class='card-hearder'>{{ __('get-reservation' )}}</div> 8 9 <div class="card-body"> 10 <form method="GET" action="javascript:void(0);" id="test"> 11 <div class="form-group row"> 12 <label for="facility_name" class="col-md-4 col-form-label text-md-right">{{ __('facility_name' )}}</label> 13 14 <div class="col-md-6"> 15 <select class="form-control" id="facility_name" name="facility_name"> 16 <option value="blank" selected="selected">選択してください</option> 17 <option value="test1">test1</option> 18 <option value="test2">test2</option> 19 <option value="test3">test4</option> 20 </select> 21 22 </div> 23 </div> 24 25 <div class="form-group row"> 26 <label for="dates" class="col-md-4 col-form-label text-md-right">{{ __('dates' )}}</label> 27 28 <div class="col-md-6"> 29 <input type="text" class="form-control dateinfo" placeholder="Select Date.." id="dateinfo" name="dateinfo" readonly="readonly"> 30 31 </div> 32 </div> 33 34 <div class="form-group row"> 35 <div class="col-md-8 offset-md-4"> 36 <button type="submit" class="btn btn-primary" id="date-select"> 37 {{ __('submit') }} 38 </button> 39 40 </div> 41 </div> 42 </form> 43 </div> 44 </div> 45 </div> 46 </div> 47 </div> 48</div> 49 50<script> 51$(function () { 52 53$(document).on("click", "#date-select", function() { 54 init_set_reservations(); 55}); 56 57// 1で発火したajaxでデータベースにアクセスして、テーブルから取得した日付の予約情報を取り出す。 58 59function init_set_reservations () { 60 61 const server_url = "http://localhost:8000/"; // 使用しているサーバーのURLを定義 62 63 64 // フォームで送信されるデータの確認 65 var formData = $('#test').serialize(); 66 console.log(formData); 67 68 // Ajax。今回は非同期で行いたい。 69 70 $.ajax({ 71 type:'GET', 72 url: server_url + "/get-reserve", 73 datatype:'json', 74 data:{ 75 dateinfo:$('#dateinfo').val(), // 日付選択のためのinputタグからの情報 76 facility_name:$('#facility_name').val() // 施設名選択のためのinputタグからの情報 77 78 } 79 80 }).done(function(data) { 81 console.log(data); 82 }); 83} 84 flatpickr(".dateinfo"); 85 86 87 88 </script> 89 </body> 90</html>

ルーティング

php

1Route::get('get-reserve', 'ReserveController@test');

モデム側のメソッド

php

1static function SearchReserveDates() { 2 3 $reserveinfo = \App\Reserve::whereHas('Facility', function($query){ 4 $query->where('facility_name', "{$facility_name}")->whereDate('start_time', "{$reservedates}")->whereDate('end_time', "{$reservedates}"); 5 })->select('id', 'start_time', 'end_time')->get()->all();

コントローラー

php

1 public function test(){ 2 if(isset($_GET['dateinfo']) && isset($_GET['facility_name'])) { 3 4 $reservedates = $_GET['dateinfo']; 5 $facility_name = $_GET['facility_name']; 6 7 $reserveinfo = Reserve::SearchReserveDates();// モデムのメソッドをそのまま書いたものでも同様の結果になる 8 9 \Debugbar::info($reserveinfo); 10 11 $json = json_encode($reserveinfo, JSON_PRETTY_PRINT); 12 13 } else { 14 dd($reservedates); 15 dd($facility_name); 16 } 17}

console.log(formData)
イメージ説明

PHP側の処理の結果
イメージ説明

Debugberで確認した実行されているSQL
イメージ説明

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

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

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

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

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

tiechel

2019/12/11 12:58

js側の、objlistをconsole.logに吐き出したものを見せていただけますか?
tiechel

2019/12/11 13:29

flatpickrは複数範囲の時刻を制限できないみたいなので、予約中の時刻を画面に表示しておいて、「予約を確定」したときに有効な時刻設定かどうかを再検証したほうがいいと思います。
kamille-mio

2019/12/11 17:52

返信ありがとうございます。 それではviewをまだ作っていないので、簡単にviewを作ってテストを実行したものを追記しておきます。
kamille-mio

2019/12/11 18:11

追記ですが、flatpickrの範囲選択はstart_timeとend_timeでそれぞれ入力欄(選択欄)を作ることで対応するというニュアンスで質問したいことに記載したのですが、それでも難しいでしょうか? もし、伝わっていなければ私の書き方が悪いです、申し訳ない……
tiechel

2019/12/11 23:43 編集

複数の予約が連続しているのであれば、start_timeの最小値とend_timeの最大値を取り出せば制御できると思いますが、連続していない場合はどうするつもりでしょうか。 サンプルでは「9:00-13:00、13:00-15:00」の予約が登録されていますので、選択できない範囲を9:00-15:00にすればいいのでしょう。 一方、「9:00-13:00、15:00-17:00」の予約が登録されていたとき、「13:00-15:00」の範囲をどのように表現したいのですか?
kamille-mio

2019/12/12 00:36

その場合は start_timeの選択時間を13:00と15:00以降にして、end_timeを14:00、15:00、飛んで18:00~とするようにしたいのが理想なのですが、書いていてflatpickrではそれができないということをおっしゃりたいのだということがなんとなく理解できました……時間の範囲選択ができるカレンダープラグインは探してみましたが、これというものが見つからないので、ダメだったら予約情報を取得、それに基づいて予約が入っている時間帯を表示するようにして、回答して頂いてる通りもし既存の予約情報と被る時間帯を選択して送信しようとしていた場合は例外処理を行うようにしたいと思います。
kamille-mio

2019/12/12 00:41

あとよろしければでいいのですが >>js側の、objlistをconsole.logに吐き出したものを見せていただけますか? ということで、簡単にviewを作ったのですが、Ajaxからサーバーへは通信できているのですが、サーバー側で予約情報を探せず(結果がnullになる)、詰まっているのでアドバイスいただけないでしょうか? コードの方は追記をしておきます。
kamille-mio

2019/12/12 01:47

returnが抜けてるのは確かにミスなので……修正して、jsonをreturnしたのですが返ってこないです。 $reserveinfo = \App\Reserve::whereHas('Facility', function($query){ $query->where('facility_name', 'test1')->whereDate('start_time', '2019-11-30')->whereDate('end_time', '2019-11-30'); })->select('id', 'start_time', 'end_time')->get()->all(); return json_encode($reserveinfo); これだと返ってくることが確認できているので、おそらくクエリビルダのwhere句の第2引数に変数を渡せてないのではと思うのですがどうでしょうか?
tiechel

2019/12/12 02:19

Reserve::SearchReserveDates()の引数に$reservedatesと$facility_nameを追加してください。 あと、このメソッドもreturnしていないですけど、見切れているからでしょうか?
kamille-mio

2019/12/12 02:51

メソッドのreturnも抜けです。 一応 static function SearchReserveDates() { $reserveinfo = \App\Reserve::whereHas('Facility', function($query){ $query->where('facility_name', "{$facility_name}")->whereDate('start_time', "{$reservedates}")->whereDate('end_time', "{$reservedates}"); })->select('id', 'start_time', 'end_time')->get()->all(); } } および public function test(){ if(isset($_GET['dateinfo']) && isset($_GET['facility_name'])) { $reservedates = $_GET['dateinfo']; $facility_name = $_GET['facility_name']; $reserveinfo = return Reserve::SearchReserveDates($facility_name,$reservedates); \Debugbar::info($reserveinfo); return json_encode($reserveinfo, JSON_PRETTY_PRINT); } else { dd($reservedates); dd($facility_name); } で試してみましたがUndefined variable: facility_nameがモデム側で出てしまいます……
kamille-mio

2019/12/12 04:50

モデムはこちら static function SearchReserveDates() { $result = \App\Reserve::whereHas('Facility', function($query){ $query->where('facility_name', "%{$facility_name}%")->whereDate('start_time', "%{$reservedates}%")->whereDate('end_time', "%{$reservedates}%"); })->select('id', 'start_time', 'end_time')->get()->all(); return $result; } コントローラーがこちら if(isset($_GET['dateinfo']) && isset($_GET['facility_name'])) { $reservedates = $_GET['dateinfo']; $facility_name = $_GET['facility_name']; $reserveinfo = Reserve::SearchReserveDates($facility_name,$reservedates); \Debugbar::info($reserveinfo); return json_encode($reserveinfo, JSON_PRETTY_PRINT); } else { dd($reservedates); dd($facility_name); } } と書き直しましたが、 Undefined variable: facility_name/home/vagrant/Code/Laravel/app/Reserve.php#31 となったままです。 >>Reserve::SearchReserveDates()の引数に$reservedatesと$facility_nameを追加してください。 は大本のモデムの方ではなく、コントローラーの方で呼び出した際に引数をつける形で間違ってないですか?
tiechel

2019/12/12 09:12 編集

受け取る側の関数に引数を用意しなければ値を渡せませんよ。 元の質問の趣旨から外れていて、いつまでもこのやりとりをしても不毛なので、コードです。 static function SearchReserveDates($facility_name, $reservedates) { $result = \App\Reserve::whereHas('Facility', function($query) use ($facility_name, $reservedates){ $query ->where('facility_name', $facility_name) ->whereDate('start_time', $reservedates) ->whereDate('end_time', $reservedates); })->select('id', 'start_time', 'end_time')->get()->all(); return $result; }
kamille-mio

2019/12/12 06:24

お付き合い頂いてありがとうございます。 モデムをそちらのコードに置き換えてコントローラー側は前述までのとPOSTにAjaxから変えてみて下記のと試してみましたが、いずれもUndefined variable: facility_name/home/vagrant/Code/Laravel/app/Reserve.phpは変わらずでした。 public function test(){ if(isset($_POST['dateinfo']) && isset($_POST['facility_name'])) { $dateinfo = $_POST['dateinfo']; $facility_name = $_POST['facility_name']; $reserveinfo = Reserve::SearchReserveDates($facility_name,$dateinfo); \Debugbar::info(); return json_encode($reserveinfo, JSON_PRETTY_PRINT); } else { echo 'FAIL TO AJAX REQUEST'; } } これ以上付き合わせてしまうのは大変申し訳ないので下記の回答をBAということでよろしいでしょうか?
tiechel

2019/12/12 10:24 編集

1個前の返信、2行目の修正が抜けていたので編集しました。 無名関数で変数を親スコープから引き継ぐには、useで渡さないといけません。 引っかかりがちなので気をつけてください。 https://www.php.net/manual/ja/functions.anonymous.php 回答は少し追記します。
kamille-mio

2019/12/12 18:34

返信ありがとうございます。 useは調べてる時に目にはしていたんですが、こういう使い方だったのですね。 しっかり確認させていただきます。 とりあえずコントローラーにviewから値は渡せているところまでは確認できていますし、質問の本筋からは離れてしまっていますし、何よりtiechelさんにもこれ以上申し訳ないのでこちらの方はこれで万が一エラーが収まらなくてももう少し自分で調べて頑張ってみます。 それでもしどうにも詰まるならまた改めて質問を立てますのでその際、お見かけになればまたお声をかけて頂けると嬉しいです。 回答の返礼に先立ちますがここまでありがとうございました。
guest

回答1

0

ベストアンサー

flatpickrを制御するのは難しいので、予約確定時にこんな感じにすればいいんじゃないかな。

js

1// 予約確定時 2$('form#reservationForm').on('submit', function(e) { 3 e.preventDefault() 4 $.ajax({ 5 type:"GET", 6 url: "get-reservation.php", 7 datatype:'json', 8 data:{ 9 date: $('#dateinfo').val(), 10 facility_name:$('#facility_name').val() 11 } 12 }).done(function(data) { 13 const obj = Json.parse(data) 14 const input_mintime = $('#mintime').val() 15 const input_maxtime = $('#maxtime').val() 16 const input_mindatetime = new Date(date) 17 const input_maxdatetime = new Date(date) 18 input_mindatetime.setHours(input_mintime.split(":")[0]) 19 input_mindatetime.setMinutes(input_mintime.split(":")[1]) 20 input_maxdatetime.setHours(input_maxtime.split(":")[0]) 21 input_maxdatetime.setMinutes(input_maxtime.split(":")[1]) 22 23 for(let dateSet of obj) { 24 const start_datetime = new Date(dateSet.start_time) 25 const end_datetime = new Date(dateSet.end_time) 26 if ( 27 (start_datetime < input_mindatetime && input_mindatetime < end_datetime) || 28 (start_datetime < input_maxdatetime && input_maxdatetime < end_datetime) 29 ) { 30 // 予約済み期間内を指定した 31 return false 32 } 33 } 34 $(this).submit() 35 }) 36})

投稿2019/12/11 14:07

編集2019/12/11 14:10
tiechel

総合スコア43

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

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

kamille-mio

2019/12/13 16:23

回答を追記されるということでしたが、ひとまず先にBAに選ばせていただきました。 私が当初想定していた挙動がflatpickrでは難しいということをご指摘頂いて、その代替案を提示していただいただけでなく、Eloquetで理解が甘いところまでご教授頂いて本当に助かりました。 ありがとうございます。 とりあえず、一番最初の話であったJSのobjlistですが、useの追加で無事、Ajax非同期でデータは取れましたのでJavascript側にPHPから返ってきたデータを載せておきます。 [ { "id": "1", "start_time": "2019-11-30 09:00:00", "end_time": "2019-11-30 13:00:00" }, { "id": "2", "start_time": "2019-11-30 13:00:00", "end_time": "2019-11-30 15:00:00" } ]
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問