又LAG隨性筆記
  • 關於我
  • 作品集
  • 生活隨筆
  • 與我聯絡
  • 隨手扎

隨手扎

October 11, 2019

30天成爲Laravel萌新(第24天) - 頁面清單 下篇(使用Pagnation和刪除按鈕)

就先來看看使用Laravel提供Pagination能夠多麼簡單。

首先,控制器只需要使用BlogPost::paginate($limit)查詢就好,並將查詢結果直接傳遞給視圖。

    public function index()
    {
        // 如果想要將每頁顯示數量變成可以調整的,
        // index需要傳入 (Request $request),並由下方方式取得$limit傳入paginate
        // $limit = $request->query('limit', 30);
        $posts = BlogPost::paginate(30);

        return view("blog/index",[
            "posts"=>$posts,
        ]);
    }

BlogPost::paginate($limit)會自動根據Request的page參數取得存取的頁面,自動計算offset,並根據給予的每頁顯示數量限制來查詢。甚至連index()都不需要傳入Request $request。傳給視圖的也少了不少。說到視圖,立馬來看看變得多簡潔:

@section('body')
    <div class="container">
        <ul>
        @foreach ($posts as $post)
            <li>
                <a href="{{route('blog/post.show',['id'=>$post->id])}}">{{ $post->title }}</a>
            </li>
        @endforeach
        </ul>
    </div>

    {{ $posts->links() }}
@endsection

列出文章清單的部份,大致什麼太大變化。但是頁面頁數選項不再那麼複雜,沒錯,只需要$post->links()就好。他會自動生成符合Bootstrap的Pagination。在瀏覽器接受到的HTML樣子可能如下:

呵呵,根本不需要寫這麼麻煩…也太簡單了吧!

October 10, 2019

30天成爲Laravel萌新(第23天) - 頁面清單 上篇

因為重點不在於CSS,不在於Bootstrap。 其實大可以將頁面弄的很美觀。在Laravel專案資料夾中,其實有一個給npm使用的package.json檔案。 不過還是來把重點放在Laravel上。

使用Pagnation前

Laravel提供一個超級簡單的方式,來處理分頁問題。不過在使用前,來看看原本要怎麼實現index()。不但要取得頁數,並計算檢索數量,然後從資料庫透過offset()、linit()的方式取得資料。

    public function index(Request $request)
    {
        $offset = $request->query("offset", 0);
        $limit = $request->query("limit", 30);
        $page = $request->query("page");

        if($page){
            $offset = ($page - 1) * $limit;
        }else{
            $page = ($offset / $limit) + 1;
        }

        $request->merge([
            "offset" => $offset,
            "page" => $page,
        ]);

        $posts = BlogPost::orderBy('activity_id','ASC')
                    ->offset($offset)
                    ->limit($limit)
                    ->get();
        return view("blog/index",[
            "posts"=>$posts,
            "page"=>$page,
            "total_pages" => $total_pages,
        ]);
    }
October 9, 2019

30天成爲Laravel萌新(第22天) - 資源控制器(Resource Controller) 下篇

最終,我決定將index()和destroy()另外寫。一個是寫完create()和edit(),destroy()也就不怎麼難。但是index()意外也能有豐富內容能寫…(加上有另一種用法我還不太會)

總體來說,這篇程式還是有些趕工粗糙….

重點觀念

  • @method的使用 相當於隱藏欄位_method。
  • @csrf的使用

建立頁面模板

同樣的,先建立一個編輯頁面的模板resource/views/blog/edit.blade.php:

@extends("base",['title'=>'編輯文章'])

@section('title', '編輯文章')


@section('body')
    <form method="post" action="{{($type=="edit") ?
                    route("blog/post.update", ["id"=>$id]) :
                    route("blog/post.store")}}">
        @csrf
        @method(($type=="edit")? "patch" : "post")

        <label for="title">標題:</label>
        <input name="title" type="text" value="{{$title}}" id="title" />
        <br/>
        <label for="content">內容:</label>
        <textarea cols="30" id="content" name="content" rows="10">{{$content}}</textarea>
        <br/>
        <input name="" type="submit" value="儲存"/>
    </form>
@endsection
October 8, 2019

30天成爲Laravel萌新(第21天) - 資源控制器(Resource Controller) 中篇

現在,要正式把控制器與資料庫連結起來。順便偷埋之後兩個主題☻。

引入所需使用的套件

首先,得先把之前建立好的Model引入。另外,我們在偷偷引入一個Illuminate\Support\Facades\Log。

use Illuminate\Support\Facades\Log;
use App\BlogPost;
use Parsedown;

完成CRUD操作

Create / Store

    public function store(Request $request)
    {
        $title = $request->input("titile", "未命名文章");
        $content = $request->input("content");

        $post = new BlogPost;
        $post->title = $title;
        $post->content = $content;
        $post->save();

        Log::info("Store New Blog Post: id = $post->id");

        return redirect()->action(
            'Blog\PostController@show', ['id' => $post->id]
        );
    }

可以透過Request的input方法,取得POST來的資料,還可以補上預設參數。這邊取得標題與內容後,建立一個新的PostBlog實體存入資料庫。

Read / Show

    public function show($id){
        $post = BlogPost::find($id);

        if(! $post){
            abort(404);
        }

        $content = $post->content;

        {
            $Parsedown = new Parsedown();
            $content = $Parsedown->text($content);
        }

        return view("blog.post", [
            "title" => $post->titile,
            "content" => $content,
        ]);
    }

讀取與之前控制器的內容差不多。不同的是,需要先從資料庫尋找資料,如果找不到就回傳404找不到錯誤頁面。之後會對該頁面進行修改。現在http://localhost/blog/post/12 將會顯示404錯誤頁面,只有http://localhost/blog/post/1 才會出現之前填入的內容。

October 7, 2019

30天成爲Laravel萌新(第20天) - 資源控制器(Resource Controller) 上篇

CRUD & RESTful

所謂CRUD是Create、Read、Update、Delete。昨天已經從資料庫模型(Model)的角度看過基本操作了,今天要將些操作加入到控制器(Controller)。

C | Create
R | Read
U | Update
D | Delete

另外,還需要另外知道的一件事情是RESTful。RESTful並不是硬性規定,只是一種在HTTP請求上的一種慣例設計。通常HTTP請求方法有GET、POST、PUT、DELETE、PATCH,以及HEAD、CONNECT、OPTIONS、TRACE。以下節錄自MDN:

GET
GET 方法請求展示指定資源。使用 GET 的請求只應用於取得資料。
HEAD
HEAD 方法請求與 GET 方法相同的回應,但它沒有回應主體(response body)。
POST
POST 方法用於提交指定資源的實體,通常會改變伺服器的狀態或副作用(side effect)。
PUT
PUT 方法會取代指定資源所酬載請求(request payload)的所有表現。
DELETE
DELETE 方法會刪除指定資源.
CONNECT
CONNECT 方法會和指定資源標明的伺服器之間,建立隧道(tunnel)。
OPTIONS
OPTIONS 方法描述指定資源的溝通方法(communication option)。
TRACE
TRACE 方法會與指定資源標明的伺服器之間,執行迴路返回測試(loop-back test)。
PATCH
PATCH 方法套用指定資源的部份修改。

其實也就差不多對應了CRUD的操作:

CRUDRESTful
CreatePOST / PUT
ReadGET
UpdatePATCH / PUT
DeleteDelete
October 6, 2019

30天成爲Laravel萌新(第19天) - Model的基本操作

ORM是物件關聯對映(Object Relational Mapping)。在Larvel裡提供的 Eloquent ORM能讓開發者以一個簡單、美觀的方式操作關聯式資料庫。今天就來寫一點點基本的操作,更多可以查看文件,以及Laravel資料庫相關文件。

Select All

在SQL,可能會用SELECT * FROM <TABLE>;來取得所有資料,儘管在資料量龐大時,這樣操作並不好,但是Laravel同樣有對應的操作:

use \App\BlogPost

$posts = App\BlogPost::all();

foreach ($posts as $post) {
    echo $post->title;
}

條件查詢Where

條件查詢也非常長使用到:

$post = App\BlogPost::where('id', 1)->get();
               // ->orderBy('name', 'desc') // 還可以加以設定以下參數
               // ->take(10)
               // ->get();

用where自然很容易從SQL轉換了解。不過,Laravel有更簡單的方式針對主鍵做查詢:

$post = App\BlogPost::find(1);

// 等同於

$post = App\BlogPost::where('active', 1)->first();
  • ««
  • «
  • 1
  • 2
  • 3
  •  … 
  • 27
  • 28
  • 29
  •  … 
  • 33
  • »
  • »»
© 又LAG隨性筆記 2023