---
# System prepended metadata

title: Laravel葵花寶典

---

# Laravel葵花寶典

:::warning
## php指令
php artisan serve
-ctrl + c 
php artisan migrate
php artisan make:migration create_users_table --create="users"
php artisan make:controller ProfileController
php artisan make:model {資料表名稱} --migration -m
:::
---
# Controllers
預設會建立在 app/Http/Controllers 目錄底下
php artisan make:controller ProfileController

建立在 app/Http/Controllers/Admin 目錄
php artisan make:controller Admin/ProfileController

## Migration
### 建立 Migration
$ php artisan make:migration create_users_table --create="users"
Migration 建立之後的檔案會放在 database/migrations/2015_04_11_134630_create_users_table.php

Migration 檔案最前面的日期會依照你建立 Migration 的時間自動產生，所以每個人看到的檔名皆會不同在後面加了 --create 的參數可以告訴 Migration，我們要做建立 user 資料表的動作，檔案內容會像這樣：

```php=
<?php
// database/migrations/2015_04_11_134630_create_users_table.php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */ㄒ
    public function up()
    {
        Schema::create('users', function(Blueprint $table)
        {
            $table->increments('id');
            $table->timestamp();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }

}
```


## Migration指令
:::success
//列出目前所有 Migration 狀態
php artisan migrate:status

//執行 Migration
php artisan migrate

//恢復上一版本的 Migration
php artisan migrate:rollback

//清除所有版本的 Migration
php artisan migrate:reset

//清除所有版本的 Migration 並重新執行
php artisan migrate:refresh

//建立資料表
php artisan make:migration create_users_table --create="userBase"

//異動資料表欄位資料
php artisan make:migration add_email_to_users_table --table="userBase"
:::

## 資料排序 orderBy
orderBy 針對給定的欄位，將查詢結果排序。
第一個參數為你要用來排序的欄位，第二個參數則控制排序的方向
<font color="#249E13"> ->asc = 正排序</font>
<font color="#249E13"> ->desc =反排序</font>



## array_push
在陣列裡面放資料進去
==必須先把這個變數宣告成陣列==

$array=[];
array_push( 欲增加的陣列, 值)=>array_push(array,value1,value2...)

範例：
```
$a=array("Dog","Cat");
array_push($a,"Horse","Bird");
print_r($a);

輸出結果：Array (Dog ,Cat ,Horse ,Bird)
```


==MyVScode:==
```
public function product() {
    $lists = DB::table('todayproducts') ->get();
    
    $discount_price = [];
    
    foreach ($lists as $key =>$value){
    array_push($discount_price, round($value->price*$value->discount));
    };
    
    return view('front.product.index' ,compact('lists', 'discount_price'));
    } 
```
==口語化:==
>＄lists as ＄key =>＄value =＄list as 索引值=>抓到的值

>array_push(＄discount_price, round（＄value->price*＄value->discount)); 
>=array_push(折扣後的價格陣列, round=小數點進位（取到的值->金額乘上取到的值->折扣後的價格））

>compact('discount_price')); =將折扣後的價格傳到前端





## 2021/06/15-會員系統 [參考教學]([(https://ithelp.ithome.com.tw/articles/10221406]))
>1.  npm install
>2.  composer install
>3.  composer require laravel/ui "^2.0"
>4.  php artisan ui vue --auth
>5.  npm install
>6.  npm run dev
>7. 改.env檔的資料庫名稱
>8. 利用資料庫軟體 新增與.env檔設定同名的資料庫
>9. php artisan migrate
> 10. php artisan serve

==.env要先更改,在啟動php artisan serve,才會實現資料庫的更改==

連線資料庫之後輸入指令
```
composer require laravel/ui "^2.0"
php artisan ui vue --auth
npm install
npm run dev
```
會出現log in 和 register

![](https://i.imgur.com/2gO0r7i.jpg)

執行`php artisan migrate`連結資料庫
匯入指令生成的migration

![](https://i.imgur.com/CCDcJwG.jpg)

1. 在資料庫(migration)加入一個新的角色權限= role
2. 加完後重新刷新資料庫(php artisan migrate:refresh)更新項目
3. 到User的model(app/User.php)新增兩個常數
    ROLE_ADMIN
    ROLE_USER 
    ，並加入剛剛新增的項目

==定義權限使用; php規則宣告常數需大寫==

```php=
const ROLE_ADMIN = 'admin';
const ROLE_USER = 'user';

protected $fillable = [ 'name', 'email', 'password', 'role'
];
```

5. 在RegisterController新增註冊時的預設身分為一般身份(Http/Auth/RegisterController.php)
    
```php=
return User::create([
    'name' => $data['name'],
    'email' => $data['email'],
    'password' => Hash::make($data['password']),
    'role' => User::ROLE_USER, 
]);
```


6. (Providers/AuthServiceProvider.php)
    判斷角色權限，將＄user的直抓進來和role比對
    結果會是Ture/False
    public function boot()
    
```php=
{
    $this->registerPolicies();
	// 新增 1
    Gate::define('admin', function ($user)
    {
        return $user->role === User::ROLE_ADMIN; // 管理者
    });
	// 新增 2
    Gate::define('user', function ($user)
    {
        return $user->role === User::ROLE_USER; // 一般身分別
    });
}
```

## `Auth::routes();` == 等同於以下這些程式碼，是可以直接使用的
[Auth::routes();解釋參考文章](https://learnku.com/laravel/t/9469/excuse-me-auth-routes-where-do-you-find-the-routes-that-are-extended-in-which-document-is-it-in)
```php=
// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');

// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
```
---
### foreach()

![](https://i.imgur.com/fi9N2N3.jpg)

---

## 更改登入權限
auth = 登入狀態
can:admin = 角色權限

```php=
Route::middleware('auth','can:admin')
```
必須同時是登入狀態和有角色權限的才可以進入


## 2021/06/16
## 產品關連
<font color="#ddr5a">透過某筆資料身上的id去找到你要的id。</font>

### VScode實作:
==<font color="#FF5E5E">product Type->一對一</font>==
==<font color="#FF5E5E">product->一對多
</font>==


在product Type和product migration裡面新增資料欄位

#### product Type
```php=
public function up()
{
    Schema::create('product_types', function (Blueprint $table)
    {
        $table->id();
        $table->string('type_name')->comment('種類名稱');
        $table->timestamps();
    });
}
```

#### product
```php=
public function up()
{
    Schema::create('products', function (Blueprint $table) 
    {
        $table->id();
        $table->string('products_name')->comment('產品名稱');
        $table->interger('products_price')->comment('產品價格');
        $table->text('products_discript')->comment('產品描述');
        $table->timestamps();
    });
}
```
:::info
product Type->==<font color="#FF5E5E"> 一對一-> hasOne</font>==
this->hasMany('存取的地方', '我的欄位名稱', '對方的欄位名稱');

```php=
public function type()
    {
        return $this->hasOne('App\ProductType', 'id', 'product_type_id');

        //寫法二
        return $this->hasOne(ProductType::get());
    }
```
:::

:::info
product->==<font color="#FF5E5E"> 一對多-> hasMany
</font>==
this->hasOne('存取的地方', '對方的欄位名稱', '我的欄位名稱');


```php=
public function Product()
    {
        return $this->hasMany('App\Product', 'product_type_id', 'id');
    }
```
:::

    
---
* public資料夾是對外公開的->File storge

## request
* 在表單送出的時候網路傳送端會有很多資料，F12->Network查看
request會幫你接住
$request->all()表示你只要顯示資料庫的資料

### 存取表單內容
```php=
public function store(Request $request)
    {
        $new_record = new ProductType();
        $new_record->product_type = $request->product_type;

        return redirect('admin/product/type')->with('message', '新增種類成功！');
    }
```
```php=

public function store(Request $request)
    {
        ProductType::create([
        'product_type' => $request->product_type,
    ]);
        return redirect('admin/product/type')->with('message', '新增種類成功！');
    }
```
```php=

public function store(Request $request)
    {
       ProductType::create($request->all());

        return redirect('admin/product/type')->with('message', '新增種類成功！');
    }
```
>以上三種寫法都可以得到一樣的結果
>>解釋為：Request $request接收輸入的資料到ProductType的資料庫裡面create新增$request->all()接收到的所有資料;
傳送redirect給<font color="#FF5E5E">Route路徑('admin/product/type')</font>，然後帶一個新增成功的訊息。

---

當關聯的產品種類空白時，會因為沒有值所以無法存取，就會報錯

```php=
@foreach ($lists as $item)
    <tr>
        <td>{{ $item->type->product_type }}</td>
        <td>{{ $item->name }}</td>
        <td>{{ $item->image }}</td>
        <td>{{ $item->color }}</td>
        <td>{{ $item->size }}</td>
        <td>{{ $item->price }}</td>
        <td>{{ $item->discript }}</td>
    <tr>
@endforeach
```
在product_type後加上??'' = product_type??''
表示可以接受空白



---
## CDN引入
### DataTables CDN
[DataTables](https://datatables.net/examples/basic_init/zero_configuration.html)
>![](https://i.imgur.com/qEbAxf4.jpg)


### Front Awsome CDN引入
google搜尋Front Awsome CDN
![Front Awsome CDN引入](https://i.imgur.com/0YegLXA.jpg)

---
## <font color="#FF5E5E">Error::</font>
#### php指令
創建controller、magration等有問題的時候，可以查看web.的Route有沒有寫錯、沒寫完，先//掉在輸入指令即可建立成功。


:::success
官方命名方式提供
---
 
| 命名方式    |     寫法      |
| --------- | ------------ |
| 大駝峰     | ProductList  |
| 小駝峰     | productList  |
| 底線       | product_list |
          
|    命名規則    |               |               | |    |          |              
| -  | -------- | ------------ | ------------- | -------------- | ------------ |
|    |   Model:    |  Migration:  |  Controller:  |  Views:(不強制)  |  Function  |
| 1. | 大駝峰    | 底線連接單字(小寫) |     ___Controller(大駝峰) | 小寫 | 小駝峰 |
| 2. | 與表格名稱一致 | 資料表名稱複數 |     單數      | 底線連接      |
| 3. |     單數     |
| 範例: |  History  |   histories  | HistoryController |   history  |
:::