laravel入門 4 (資料修改與刪除)

 


修改資料庫(edit)

修改資料的時候 , 我們設計跳出一個彈跳視窗進行修改 , 修改完後按下 送出 就完成修改

那我們就開始吧~

views(home.blade.php)設定

<!doctype html>
<html lang="en">
	<head>
		<!-- Required meta tags -->
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

		<!-- Bootstrap CSS -->
		<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
		<!-- 引入google字體 -->
		<link href="https://fonts.googleapis.com/css?family=Lato:300,300i,400,400i,700,700i,900&amp;subset=latin-ext" rel="stylesheet">
		<style type="text/css">
			body{
				font-family: '微軟正黑體', 'Noto Sans TC', Helvetica, Arial, '黑體-繁', 'Heiti TC', '儷黑', 'LiHei', 'Microsoft JhengHei', sans-serif;
			}
		</style>
		<title>Note</title>
	</head>
  	<body>
	  	<div class="container">
	  		<div class="row">
	  			<div class="col-12">
	  				<h1 class="text-center mt-2">Note</h1>
	  				<input type="text" class="form-control mt-5"  placeholder="標題" id="newTitle">
	  				<textarea class="form-control mt-2" placeholder="內容" rows="3" id="newContent"></textarea>
	  			</div>
	  			<div class="col-12 text-right mt-2">
	  				<button type="button" class="btn btn-primary" onclick="addItem()">新增</button>
	  			</div>

	  			<div class="col-12 mt-5">
					<table class="table">
						<thead class="thead-light">
							<tr>
								<th width="200">標題</th>
								<th width="600">內容</th>
								<th>時間</th>
								<th style="min-width: 150px;">操作</th>
							</tr>
						</thead>
					  <tbody>
					  	<!-- 把假資料刪除後 , 將後端資料帶入html裡面 -->
					  	@foreach ($data as $val)
					    <tr>
							<td>{{$val->title}}</td>
							<td>{{$val->content}}</td>
							<th>{{$val->created_at}}</th>
							<td>
								<button type="button" class="btn btn-secondary" data-toggle="modal" data-target="#exampleModal" onclick="getItem({{ $val->id }})">編輯</button>
								<button type="button" class="btn btn-danger">刪除</button>
							</td>
					    </tr>
					    @endforeach
					  </tbody>
					</table>
	  			</div>
	  		</div>
	  	</div>

		<!-- 編輯視窗 -->
		<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
			<div class="modal-dialog" role="document">
				<div class="modal-content">
					<div class="modal-header">
						<h5 class="modal-title" id="exampleModalLabel"><b>編輯</b></h5>
						<button type="button" class="close" data-dismiss="modal" aria-label="Close">
						  	<span aria-hidden="true">&times;</span>
						</button>
					</div>
				<div class="modal-body">
					<div class="form-group">
						<label class="col-form-label">標題:</label>
						<input type="text" class="form-control" id='editTitle'>
					</div>
					<div class="form-group">
						<label class="col-form-label">內容:</label>
						<textarea class="form-control" id='editContent'></textarea>
					</div>
				</div>
				<div class="modal-footer">
					<button type="button" class="btn btn-secondary" data-dismiss="modal">關閉</button>
					<button type="button" class="btn btn-primary" onclick="editItem()">送出</button>
				</div>
				</div>
			</div>
		</div>

	    <!-- Optional JavaScript -->
	    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
	    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
	    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
	    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>

	   	<!--  載入Laravel的內建前端套件 ,現在目的是要載入Axios -->
	    <script src="{{URL::asset('js/app.js')}}"></script>
	</body>
</html>

<script type="text/javascript">
	function addItem() {
		//取得資料
		var title = $('#newTitle').val();
		var content = $('#newContent').val();

		//檢查有沒有填寫資料
		if (!title) {
			alert('請填寫標題');
			return
		}
		if (!content) {
			alert('請填寫內容');
			return
		}

		//傳送到後端
	    axios.post('/addItem', {
	        title:title,
	        content:content
	    })
	    .then(function (response) {
	    	if (response.data.result == 'success') {
	    		//後端回傳過來是成功後,重整頁面
	    		location.reload();
	    	}
	    })
	    .catch(function (error) {
	        console.log(error);
	    });
	}
	function getItem(id) {
		//傳送到後端,並且取得資料
	    axios.post('/getItem', {
	        id:id
	    })
	    .then(function (response) {
	    	if (response.data.result == 'success') {
	    		$('#editTitle').val(response.data.data.title);
	    		$('#editContent').val(response.data.data.content);
	    		//使用一個 全域性的變數 ,來儲存要被編輯的ID , 等等真的要修改的時候直接取得
	    		window.editId = response.data.data.id;
	    	}
	    })
	    .catch(function (error) {
	        console.log(error);
	    });
	}
	function editItem() {
		//傳送到後端,並且修改
	    axios.post('/editItem', {
	    	//取得要修改的資料
    		title : $('#editTitle').val(),
    		content : $('#editContent').val(),
	    	//取得剛剛的ID
	        id:window.editId
	    })
	    .then(function (response) {
	    	if (response.data.result == 'success') {
	    		//後端回傳過來是成功後,重整頁面
	    		location.reload();
	    	}
	    })
	    .catch(function (error) {
	        console.log(error);
	    });
	}
</script>

重點說明如下 : 

將一開始頁面取得的id , 帶入onclick事件

<button type="button" class="btn btn-secondary" data-toggle="modal" data-target="#exampleModal" onclick="getItem({{ $val->id }})">編輯</button>

將彈跳視輸入框新增ID , 才可以用js取得資料

<input type="text" class="form-control" id='editTitle'>
<textarea class="form-control" id='editContent'></textarea>

取得資料後 , 再更改彈跳視窗的資料

	function getItem(id) {
		//傳送到後端,並且取得資料
	    axios.post('/getItem', {
	        id:id
	    })
	    .then(function (response) {
	    	if (response.data.result == 'success') {
	    		$('#editTitle').val(response.data.data.title);
	    		$('#editContent').val(response.data.data.content);
	    		//使用一個 全域性的變數 ,來儲存要被編輯的ID , 等等真的要修改的時候直接取得
	    		window.editId = response.data.data.id;
	    	}
	    })
	    .catch(function (error) {
	        console.log(error);
	    });
	}

將彈跳視的輸出按鈕新增onclick事件 , 按下後修改資料

<button type="button" class="btn btn-primary" onclick="editItem()">送出</button>

修改資料

	function editItem() {
		//傳送到後端,並且修改
	    axios.post('/editItem', {
	    	//取得要修改的資料
    		title : $('#editTitle').val(),
    		content : $('#editContent').val(),
	    	//取得剛剛的ID
	        id:window.editId
	    })
	    .then(function (response) {
	    	if (response.data.result == 'success') {
	    		//後端回傳過來是成功後,重整頁面
	    		location.reload();
	    	}
	    })
	    .catch(function (error) {
	        console.log(error);
	    });
	}

route(routes/web.php)設定

//取得項目
Route::post('getItem','NoteController@getItem');
//編輯項目
Route::post('editItem','NoteController@editItem');

Controllers(app/Controllers/NoteController.php)設定

    //取得項目
    public function getItem(Request $request)
    {
    	//接收前端資料
    	$id = $request->input('id');

    	//取得資料庫資料
    	$data = Item::select('id','title','content')
    			->where('id',$id)
    			//最後一定要寫get()來結尾 , 不然會出錯
    			->first();
    			
    	//用json格式回傳結果,與資料
    	return response()->json(['result' => 'success','data' => $data]);
    }
    //更新項目
    public function editItem(Request $request)
    {
        //接收前端資料
        $id = $request->input('id');
        $title = $request->input('title');
        $content = $request->input('content');

        //修改資料庫
        Item::
        where('id',$id)
        ->update([
            //'資料庫欄位'=>資料
            'title'=> $title,
            'content'=> $content,
            'updated_at'=> NOW()
        ]);

        //用json格式回傳結果
        return response()->json(['result' => 'success']);
    }


刪除資料庫(delete)

views(home.blade.php)設定

<!doctype html>
<html lang="en">
	<head>
		<!-- Required meta tags -->
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

		<!-- Bootstrap CSS -->
		<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
		<!-- 引入google字體 -->
		<link href="https://fonts.googleapis.com/css?family=Lato:300,300i,400,400i,700,700i,900&amp;subset=latin-ext" rel="stylesheet">
		<style type="text/css">
			body{
				font-family: '微軟正黑體', 'Noto Sans TC', Helvetica, Arial, '黑體-繁', 'Heiti TC', '儷黑', 'LiHei', 'Microsoft JhengHei', sans-serif;
			}
		</style>
		<title>Note</title>
	</head>
  	<body>
	  	<div class="container">
	  		<div class="row">
	  			<div class="col-12">
	  				<h1 class="text-center mt-2">Note</h1>
	  				<input type="text" class="form-control mt-5"  placeholder="標題" id="newTitle">
	  				<textarea class="form-control mt-2" placeholder="內容" rows="3" id="newContent"></textarea>
	  			</div>
	  			<div class="col-12 text-right mt-2">
	  				<button type="button" class="btn btn-primary" onclick="addItem()">新增</button>
	  			</div>

	  			<div class="col-12 mt-5">
					<table class="table">
						<thead class="thead-light">
							<tr>
								<th width="200">標題</th>
								<th width="600">內容</th>
								<th>時間</th>
								<th style="min-width: 150px;">操作</th>
							</tr>
						</thead>
					  <tbody>
					  	<!-- 把假資料刪除後 , 將後端資料帶入html裡面 -->
					  	@foreach ($data as $val)
					    <tr>
							<td>{{$val->title}}</td>
							<td>{{$val->content}}</td>
							<th>{{$val->created_at}}</th>
							<td>
								<button type="button" class="btn btn-secondary" data-toggle="modal" data-target="#exampleModal" onclick="getItem({{ $val->id }})">編輯</button>
								<button type="button" class="btn btn-danger" onclick="deleteItem({{ $val->id }})">刪除</button>
							</td>
					    </tr>
					    @endforeach
					  </tbody>
					</table>
	  			</div>
	  		</div>
	  	</div>

		<!-- 編輯視窗 -->
		<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
			<div class="modal-dialog" role="document">
				<div class="modal-content">
					<div class="modal-header">
						<h5 class="modal-title" id="exampleModalLabel"><b>編輯</b></h5>
						<button type="button" class="close" data-dismiss="modal" aria-label="Close">
						  	<span aria-hidden="true">&times;</span>
						</button>
					</div>
				<div class="modal-body">
					<div class="form-group">
						<label class="col-form-label">標題:</label>
						<input type="text" class="form-control" id='editTitle'>
					</div>
					<div class="form-group">
						<label class="col-form-label">內容:</label>
						<textarea class="form-control" id='editContent'></textarea>
					</div>
				</div>
				<div class="modal-footer">
					<button type="button" class="btn btn-secondary" data-dismiss="modal">關閉</button>
					<button type="button" class="btn btn-primary" onclick="editItem()">送出</button>
				</div>
				</div>
			</div>
		</div>

	    <!-- Optional JavaScript -->
	    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
	    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
	    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
	    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>

	   	<!--  載入Laravel的內建前端套件 ,現在目的是要載入Axios -->
	    <script src="{{URL::asset('js/app.js')}}"></script>
	</body>
</html>

<script type="text/javascript">
	function addItem() {
		//取得資料
		var title = $('#newTitle').val();
		var content = $('#newContent').val();

		//檢查有沒有填寫資料
		if (!title) {
			alert('請填寫標題');
			return
		}
		if (!content) {
			alert('請填寫內容');
			return
		}

		//傳送到後端
	    axios.post('/addItem', {
	        title:title,
	        content:content
	    })
	    .then(function (response) {
	    	if (response.data.result == 'success') {
	    		//後端回傳過來是成功後,重整頁面
	    		location.reload();
	    	}
	    })
	    .catch(function (error) {
	        console.log(error);
	    });
	}
	function getItem(id) {
		//傳送到後端,並且取得資料
	    axios.post('/getItem', {
	        id:id
	    })
	    .then(function (response) {
	    	if (response.data.result == 'success') {
	    		$('#editTitle').val(response.data.data.title);
	    		$('#editContent').val(response.data.data.content);
	    		//使用一個 全域性的變數 ,來儲存要被編輯的ID , 等等真的要修改的時候直接取得
	    		window.editId = response.data.data.id;
	    	}
	    })
	    .catch(function (error) {
	        console.log(error);
	    });
	}
	function editItem() {
		//傳送到後端,並且修改
	    axios.post('/editItem', {
	    	//取得要修改的資料
    		title : $('#editTitle').val(),
    		content : $('#editContent').val(),
	    	//取得剛剛的ID
	        id:window.editId
	    })
	    .then(function (response) {
	    	if (response.data.result == 'success') {
	    		//後端回傳過來是成功後,重整頁面
	    		location.reload();
	    	}
	    })
	    .catch(function (error) {
	        console.log(error);
	    });
	}
	function deleteItem(id) {
		//js內建的詢問視窗 , 以免誤觸後刪除
		var check = confirm("確定要刪除嗎 ?");
		//如果點到確定後才會執行
		if (check == true) {
		    axios.post('/deleteItem', {
		        id:id
		    })
		    .then(function (response) {
		    	if (response.data.result == 'success') {
		    		//後端回傳過來是成功後,重整頁面
		    		location.reload();
		    	}
		    })
		    .catch(function (error) {
		        console.log(error);
		    });
		}
	}
</script>

重點說明如下 : 

將一開始頁面取得的id , 帶入onclick事件

<button type="button" class="btn btn-danger" onclick="deleteItem({{ $val->id }})">刪除</button>

使用confirm() 來防止誤觸刪除按鈕 , 如果確定後直接把id丟到後端刪除

	function deleteItem(id) {
		//js內建的詢問視窗 , 以免誤觸後刪除
		var check = confirm("確定要刪除嗎 ?");
		//如果點到確定後才會執行
		if (check == true) {
		    axios.post('/deleteItem', {
		        id:id
		    })
		    .then(function (response) {
		    	if (response.data.result == 'success') {
		    		//後端回傳過來是成功後,重整頁面
		    		location.reload();
		    	}
		    })
		    .catch(function (error) {
		        console.log(error);
		    });
		}
	}

route(routes/web.php)設定

//刪除項目
Route::post('deleteItem','NoteController@deleteItem');

Controllers(app/Controllers/NoteController.php)設定

    public function deleteItem(Request $request)
    {
        //接收前端資料
        $id = $request->input('id');

        //刪除資料庫的資料
        Item::
        where('id', '=', $id)
        ->delete();

        //用json格式回傳結果
        return response()->json(['result' => 'success']);
    }

終於結束了😂😂😂😂~~~~~~~~~

一開始碰可能會有點複雜 , 但在練習過幾次後是不是就覺得都在做同樣的事情呢

當然這個只是很簡單很簡單的範例 ~

大家一定要再深入地了解更多的細節 , 希望大家都可以學會Laravel ~

在下一章節我會貼上所有的程式碼 方便大家練習~


留言

這個網誌中的熱門文章

網頁入門教材目錄

什麼是HTML?

網頁是怎麼運作的呢?