玩转laravel5.4的入门动作(二)
做个文章的增删改查
第一步 把数据库的表结构建好,生成迁移
1 怎么建,当然是用php artisan命令了
使用 Artisan 命令 make:migration 来创建一个新的迁移:
php artisan make:migration create_article_table
2 新的迁移位于 database/migrations 目录下,每个迁移文件名都包含时间戳从而允许 Laravel 判断其顺序。
找到 2017_08_12_021758_create_article_table.php 文件
在public function up 把建表语句建好
public function up() { Schema::create('article', function (Blueprint $table) { $table->increments('id'); $table->string('title', 100); $table->text('description'); $table->timestamps(); }); }
public function down 就是删除表
public function down() { Schema::drop('article'); }
3 运行数据迁移 就是建表语句的创建
php artisan migrate
默认的 user 表和password_resets 报错 把 user表的unique和password表的创建索引给去掉
执行成功,查看article表创建完毕
表建立完毕了,那么用系统自带的工具 orm模型 自动创建增删改
1创建模型,还是使用命令
php artisan make:model Article
生成的文件在 blog\app\下
2 模型建立完毕,可以获取模型了
为了方便测试,手工在数据库的article表中,随便插入2条数据,
然后在控制器中 调用模型中的数据 来查看
在 blog\app\Article.php 中 增加表的名字
protected $table = 'article';
3 在控制器调用数据看下
控制器顶部增加 use App\Article;
函数中增加
$articles = Article::all();
foreach ($articles as $article) {
echo $article->title;
}
4 查看下数据
好了,基础的测试通了,咱们开始增删改了
1 先给article创建个控制器
php artisan make:controller ArticleController
生成的文件在 blog\app\Http\Controllers 这个目录下
2 设置路由规则 可访问 articlecontroller的函数
在blog/routes/web.php
Route::resource('article', 'ArticleController'); Route::get('article/show/{id}', 'ArticleController@show');
添加如下 第一个是设置文章控制器和内部的方法可用
第二个是设置URL 访问文章控制器的show方法
3 填充 文章控制器
<?php namespace App\Http\Controllers; use Illuminate\Http\Request;
use App\Article; class ArticleController extends Controller
{
/**
* 添加文章
*/
public function store(Request $request)
{
$article = new Article;
$article->title = $request->input('title');
$article->description = $request->input('description');
if ($article->save()) {
return redirect('article');
} else {
return back()->withInput()->withErrors('保存失败');
}
} /**
* 更新文章
*/
public function update(Request $request,$id)
{
$article = Article::find($id);
$article->title = $request->input('title');
$article->description = $request->input('description'); if ($article->save()) {
return redirect('article');
} else {
return back()->withInput()->withErrors('保存失败');
}
} /**
文章添加展示页
**/
public function create()
{
return view('article.create');
} //文章更新展示页
public function edit($id)
{
$article=Article::find($id); return view('article.edit',compact('article'));
} //文章删除
public function destroy($id)
{
$article = Article::find($id);
$article->delete();
return redirect('article');
} //文章列表
public function index()
{
$articles = Article::all();
return view('article.index',compact('articles'));
} //文章显示
public function show($id)
{
$article=Article::find($id); return view('article.show',compact('article'));
}
}
4 设置模板页
模板页面位置在blog\resources\views 这个位置
1)在views\layouts\app.blade.php 改成如下代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>test</title>
<link href="/css/app.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle Navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">后台管理系统</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/home">后台首页</a></li>
<ul class="nav navbar-nav">
<li><a href="/article">管理文章</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
@if (Auth::guest())
<li><a href="{{ route('login') }}">登录</a></li>
<li><a href="{{ route('register') }}">注册</a></li>
@else
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">{{ Auth::user()->name }} <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="{{ route('logout') }}" onclick="event.preventDefault();
document.getElementById('logout-form').submit();">退出</a></li>
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
</ul>
</li>
@endif
</ul>
</div>
</div>
</nav>
@yield('content')
<!-- Scripts -->
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</body>
</html>
2)我们新建一个article文件夹
新建4个模板文件
create.blade.php
@extends('layouts.app') @section('content')
<div class="container">
<div class="row">
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<div class="panel-heading">新增文章</div> <div class="panel-body"> @if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif <form action="{{ URL('article') }}" enctype="multipart/form-data" method="POST">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
文章标题:<input type="text" name="title" class="form-control" required="required">
<br> <br> 文章内容: <textarea name="description" rows="10" class="form-control"></textarea>
<br>
<button class="btn btn-lg btn-info">新增文章</button>
</form> </div>
</div>
</div>
</div>
</div>
@endsection
edit.blade.php
@extends('layouts.app') @section('content')
<div class="container">
<div class="row">
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<div class="panel-heading">编辑文章</div> <div class="panel-body"> @if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif <form action="{{ URL('article/'.$article->id) }}" enctype="multipart/form-data" method="POST">
<input name="_method" type="hidden" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
文章标题:<input type="text" name="title" class="form-control" required="required" value="{{ $article->title }}">
<br> <br> <br>
文章内容:<textarea name="description" rows="10" class="form-control" required="required">{{ $article->description }}</textarea>
<br>
<button class="btn btn-lg btn-info">编辑文章</button>
</form> </div>
</div>
</div>
</div>
</div>
@endsection
index.blade.php
@extends('layouts.app') @section('content')
<div class="container">
<div class="row">
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<div class="panel-heading">管理文章</div> <div class="panel-body">
<a href="{{ URL('article/create') }}" class="btn btn-lg btn-primary">新增</a>
<table class="table table-striped">
<tr class="row">
<th class="col-lg-4">内容</th>
<th class="col-lg-2">标题</th>
<th class="col-lg-4">查看</th>
<th class="col-lg-1">编辑</th>
<th class="col-lg-1">删除</th>
</tr>
@foreach ($articles as $article)
<tr class="row">
<td class="col-lg-6">
{{ $article->description }}
</td>
<td class="col-lg-2">
{{ $article->title }}
</td>
<td class="col-lg-4">
<a href="{{ URL('article/show/'.$article->id) }}" target="_blank">
{{ App\Article::find($article->id)->title }}
</a>
</td>
<td class="col-lg-1">
<a href="{{ URL('article/'.$article->id.'/edit') }}" class="btn btn-success">编辑</a>
</td>
<td class="col-lg-1">
<form action="{{ URL('article/'.$article->id) }}" method="POST" style="display: inline;">
<input name="_method" type="hidden" value="DELETE">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<button type="submit" class="btn btn-danger">删除</button>
</form>
</td>
</tr>
@endforeach
</table> </div>
</div>
</div>
</div>
</div>
@endsection
show.blade.php
@extends('layouts.app') @section('content')
<div class="container">
<div class="row">
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<div class="panel-heading">显示文章</div> <div class="panel-body"> @if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif <input name="_method" type="hidden" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
文章标题:{{ $article->title }}
<br> <br> <br>
文章内容:{{ $article->description }}
<br> </div>
</div>
</div>
</div>
</div>
@endsection
5 登录后台 操作增删改查
源码文件在此,欢迎对照查阅
https://github.com/baker95935/laravelPractise5.4
玩转laravel5.4的入门动作(二)的更多相关文章
- 玩转laravel5.4的入门动作(一)
安装前 1 laravel是用composer来做的依赖关系,所以先下载composer 下载地址在这里https://getcomposer.org/download/ windows lin ...
- Bootstrap入门(二十一)组件15:警告框
Bootstrap入门(二十一)组件15:警告框 通过这些简单.灵活的进度条,为当前工作流程或动作提供实时反馈. 进度条组件使用了 CSS3 的 transition 和 animation 属性来完 ...
- Bootstrap入门(二十)组件14:警告框
Bootstrap入门(二十)组件14:警告框 警告框组件通过提供一些灵活的预定义消息,为常见的用户动作提供反馈消息,提示.通知或者警示,可以迅速吸引注意力. 1.情景警告框 2.可关闭的警告框 3. ...
- 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第一篇) 入门详解 - 精简归纳 ...
- 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 ...
- 无废话ExtJs 入门教程二十一[继承:Extend]
无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...
- 无废话ExtJs 入门教程二十[数据交互:AJAX]
无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...
- Bootstrap入门(二)栅格
Bootstrap入门(二)栅格 Bootstrap入门(二)栅格 全局CSS样式--栅格 先引入本地的CSS文件(根据自己的文件夹,有不同的引入地址,我是放在一个新建的名为css的文件夹中) con ...
- Android工程师入门(二)——不忙不累怎么睡。。
安卓开发迫在眉睫,这周入个门吧! Android工程师入门(二) 四.在界面中显示图片 ImageView 是显示图片的一个控件. --属性 src——内容图片: background——背景图片/背 ...
随机推荐
- Spring4.3整合Hibernate4.3搭建Spring MVC
1,web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...
- (3)socket的基础使用(基于UDP协议)
服务端代码 import socket server =socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #SOCK_DGRAM就是数据报,UDP就是数据 ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(十)-- 发布(Windows)
本篇将在这个系列演示的例子上继续记录Asp.Net Core在Windows上发布的过程. Asp.Net Core在Windows上可以采用两种运行方式.一种是自托管运行,另一种是发布到IIS托管运 ...
- BZOJ2460,LG4570 [BJWC2011]元素
题意 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石. 一般地,矿石越多则法力越强,但物极必反:有 ...
- TensorFlow笔记-06-神经网络优化-损失函数,自定义损失函数,交叉熵
TensorFlow笔记-06-神经网络优化-损失函数,自定义损失函数,交叉熵 神经元模型:用数学公式比表示为:f(Σi xi*wi + b), f为激活函数 神经网络 是以神经元为基本单位构成的 激 ...
- Composer 技巧(以 FastAdmin 项目为基础)(2018-12-25 更新)
Composer 技巧(以 FastAdmin 项目为基础) 查看 FastAdmin 所有的已安装的 php 组件,如果不加 i 就是查看 composer.json 里的组件. composer ...
- koa2 知识点
koa2 常用功能: 假设 Koa 提供的 Context 对象的实例为 ctx table th:first-of-type { width: 200px; } table th:nth-of-ty ...
- HttpCookieCollection类
一.最近在研究HttpRequest类的时候,发现返回的cookie集合是存在放这个类的对象的.而实际上这个类只是一个HttpCookie对象的集合,关于HttpCookie类可以查看http://w ...
- asp.net core控制台项目运行
cmd中进入项目生成的dll目录下 运行命令: start dotnet xxx.dll
- BASIC-11_蓝桥杯_十六进制转十进制
注意事项: 1.长数据注意选择long long类型,用%ldd输出,防止数据溢出; 示例代码: #include <stdio.h>#include <string.h>#i ...