1. 程式人生 > >Laravel入門與實戰示例程式碼----資料庫和Eloquent

Laravel入門與實戰示例程式碼----資料庫和Eloquent

示例8-1 資料庫預設連線列表

'connections' =>[
    'sqlite' => [
        'driver' => 'sqlite',
        'database' => database_path('database.sqlite'),
        'prefix' => '',
    ],

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'database'
=> env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNMAE', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => false, 'engine' => null, ], 'pgsql' => [ 'driver'
=> 'pgsql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNMAE', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => false, 'schema'
=> 'public', ], 'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNMAE', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => false, ], ]

示例8-2 Laravel中預設“建立使用者表”遷移

<?php

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

class CreateUsersTable extends Migration{
    public function up(){
        Schema::create('users', function(Blueprint $table){
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    public function down(){
        Schema::drop('users');
    }
}

示例8-3 在遷移中新增列索引

// 建立列之後
$table->primary('primary_id');
$table->primary(['first_name', 'last_name']);
$table->unique('email');
$table->unique('email', 'optional_custom_index_name');
$table->index('amount');
$table->index('amount', 'optional_custom_index_name');

示例8-4 在遷移中刪除列索引

$table->dropPrimary('contacts_id_primary');
$table->dropUnique('contacts_email_unique');
$table->dropIndex('optional_custom_index_name');

示例8-5 使用模型工廠

factory(Post::class)->create([
    'title' => 'My greatest post ever'
]);

factory(User::class, 20)->create()->each(function ($u) use ($post){
    $post->comments()->save(factory(Comment::class)->make([
        'user_id' => $u->id
    ]));
});

示例8-6 為同一個模型定義多個工廠模型

$factory->define(Contact::class, function(Faker\Generator $faker){
    return [
        'name' => $faker->name,
        'email' => $faker->email,
    ];
});

$factory->defineAs(Contact::class, 'vip',function (Faker\Generator $faker){
    return [
        'name' => $faker->name,
        'email' => $faker->email,
        'vip' => true,
    ];
});

示例8-7 繼承工廠型別

$factory->define(Contact::class, function(Faker\Generator $faker){
    return [
        'name' => $faker->name,
        'email' => $faker->email,
    ];
});

$factory->defineAs(
    Contact::class,
    'vip',
    function(Faker\Generator $faker) use ($factory){
        $contact = $factory->raw(Contact::class);
        return array_merge($contact, ['vip' => true]);
    });

示例8-8 原始SQL和查詢構造器使用示例

//基本語句
DB::statement('drop table users');
//原始查詢和引數繫結
DB::select('select * from contacts where validated =?',[true]);
//選擇使用流暢構造器
$users = DB::table('users')->get();
//joins和其他呼叫
DB::table('users')
    ->join('contacts', function($join){
        $join->on('users.id', '=', 'contacts.user_id')
            ->where('contacts.type', 'donor');
    })->get();

示例8-9 一個簡單的資料庫事務

DB::transaction(function() use ($userId,$numVotes){
    //可能失敗的DB查詢
    DB::table('users')
        ->where('id', $userId)
        ->update(['votes' => $numVotes]);
    //當上面的查詢失敗時,快取不想執行的查詢
    DB::table('votes')
        ->where('user_id', $userId)
        ->delete();
});

示例8-10 最簡單的Eloquent模型

<?php
use Illuminate\Database\Eloquent\Model;
class Contact extends Model{}

示例8-11 最簡單的Eloquent模型實現的操作

public function save(Request $request){
    $contact = new Contact();
    $contact->first_name = $request->input('first_name');
    $contact->last_name = $request->input('last_name');
    $contact->email = $request->input('email');
    $contact->save();
    return redirect('contacts');
}

public function show($contactId){
    return Contact::findOrFail($contactId);
}

public function vips(){
    return Contact::where('vip' , true)->get()->map(function($contact){
        $contact->formalName = "The exalted {$contact->first_name} of the {$contact->last_name}s";

        return $contact;
    });
}

示例8-12 在控制器方法中使用Eloquent的OrFail()方法

public function show($contactId){
    return view('contact.show')
        ->with('contact', Contact::findOrFail($contactId));
}

示例8-13 對 Eloquent 查詢進行分塊來限制記憶體使用

Contact::chunk(100, function($contact){
    foreach($contacts as $contact){
        //對$contact進行操作
    }
});

示例8-14 通過建立一個新的例項插入 Eloquent 記錄

$contact = new Contact;
$contact->name = 'Ken Hirata';
$contact->email = '[email protected]';
$contact->save();

$contact = new Contact([
    'name' => 'Ken Hirata',
    'email' => '[email protected]'
]);
$contact->save();

示例8-15 向create()傳入一個數組插入 Eloquent 記錄

$contact = Contact::create([
    'name' => 'Keahi Hale',
    'email' => '[email protected]'
]);

示例8-16 通過更新例項的方式更新 Eloquent 記錄並儲存

$contact = Contact::find(1);
$contact->email = '[email protected]';
$contact->save();

示例8-17 向update()傳入陣列以更新一條或多條 Eloquent記錄

Contact::where('create_at','<',Carbon::now()->subYear())
    ->update(['longevity' => 'ancient']);

$contact = Contact::find(1);
$contact->update(['longevity' => 'ancient']);

示例8-18 使用整個請求輸入更新 Eloquent 模型

//Contact控制器
public function update(Contact $contact,Request $request){
    $contact->update($request->all());
}

示例8-19 通過 Eloquent 的“可填充” 或 “防護” 屬性定義批量賦值的欄位

class Contact{
    protected $fillable = ['name', 'email'];
    //或
    protected $guarded = ['id' , 'created_at', 'update_at', 'owner_id'];
}

示例8-20 在遷移中新增軟刪除

Schema::table('contacts', function(Blueprint $table){
    $table->softDeletes();
});

示例8-21 在 Eloquent 模型中開啟軟刪除

<?php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Contact extends Model{
    use SoftDeletes;
    protected $dates = ['deleted_at'];
}

示例8-22 使用閉包新增全域性作用域

...
class Contact extends Model{
    protected static function boot(){
        parent::boot();
        static::addGlobalScope('active', function(Builder $builder){
            $builder->where('active', true);
        });
    }
}

示例8-23 建立全域性作用域類

<?php
namespace App\Scores;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Scope;

class ActiveScope implements Scope{
    public function apply(Builder $builder, Model $model){
        return $builder->where('active', true);
    }
}

示例8-24 應用一個基於類的全域性作用域

<?php
use App\Scopes\ActiveScope;
use Illuminate\Database\Eloquent\Model;
class Contact extends Model{
    protected static function boot(){
        parent::boot();
        static::addGlobalScope(new ActiveScope);
    }
}

示例8-25 用 Eloquent 訪問器裝飾一個已存在的列

//模型定義
class Contact extends Model{
    public function getNameAttribute($value){
        return $value?: '(No name provided)';
    }
}
//使用訪問器
$name = $contact->name;

示例8-26 使用 Eloquent 訪問器為不存在的backing列定義屬性

//模型定義
class Contact extends Model{
    public function getFullNameAttribute(){
        return $this->first_name . ' ' . $this->last_name;
    }
}
//使用訪問器
$fullName = $contact->full_name;

示例8-27 通過Eloquent修改器對屬性值的裝飾設定

//定義修改器
class Order extends Model{
    public function setAmountAttribute($value){
        $this->attributes['amount'] = $value > 0? $value:0;
    }
}

//使用修改器
$order->amount = '15';

示例8-28 通過Eloquent修改器設定不存在屬性的值

//定義修飾器
class Order extends Model{
    public function setWorkgroupNameAttribute($workgroupName){
        $this->attributes['email']="{$workgroupName}@ourcompany.com";
    }
}
//使用修改器
$order->workgroup_name = 'jstott';

示例8-29 在 Eloquent模型中使用屬性轉化器

class Contact{
    protected $casts = [
        'vip' => 'boolean',
        'children name' => 'array',
        'bitthday' => 'date',
    ];
}

示例8-30 定義會被轉換為timestamps型別的列

class Contact{
    protected $dates = [
        'met_at'
    ];
}

示例8-31 自定義 Eloquent模型中的集合類

...
class OrderCollection extends Collection{
    public function sumBillableAmount(){
        return $this->reduce(function ($carry,$order){
            return $carry+($order->billable? $order->amount:0);
        },0);
    }
}
...
class Order extends Model{
    public function newCollection(array $models = []){
        return new OrderCollection($models);
    }
}

示例8-32 從路由中直接返回JSON

//routes/web.php
Route::get('api/contacts', function(){
    return Contact::all();
});

示例8-33 定義一對一關係

class Contact extends Model{
    public function phoneNumber(){
        return $this->hasOne(PhoneNumber::class);
    }
}

示例8-34 定義反向的一對一關係

class PhoneNumber extends Model{
    public function contact(){
        return $this->belongsTo(Contact::class);
    }
}

示例8-35 定義一個一對多關係

class User extends Model{
    public function contacts(){
        return $this-->hasMany(Contact::class);
    }
}

示例8-36 定義一對多反向關係

class Contact extends Model{
    public function user(){
        return $this->belongsTo(User::class);
    }
}

示例8-37 定義遠端一對多關係

class User extends Model{
    public function phoneNumbers(){
        return $this->hasManyThrough(PhoneNumber::class,Contact::class);
    }
}

示例8-38 定義多對多關係

class User extends Model{
    public function contacts(){
        return $this->belongsToMany(Contact::class);
    }
}

示例8-39 定義反向多對多關係

class Contact extends Model{
    public function users(){
        return $this->belongsToMany(User::class);
    }
}

示例8-40 在多對多關係中雙向訪問關聯內容

$user = User::first();
$user->contacts->each(function ($contact){
    //進一步操作
});

$contact = Contact::first();
$contact->users->each(function ($user){
    //
});

$donors = $user->contacts()->where('status', 'donor')->get();

示例8-41 在透視表中新增欄位

public function contacts(){
    return $this->belongsToMany(Contact::class)
        ->withTimestamps()
        ->withPrivot('staus', 'preferred_greeting');
}

示例8-42 從關聯內容的透視條目中獲取資料

$user = User::first();
$user->contacts->each(function($contact){
    echo sprintf(
        'Contact associated with this user at: %s',
        $contact->pivot->created_at;
    );
});

示例8-43 從多臺評分系統中建立模型

class Star extends Model{
    public function starrable(){
        return $this->morphosTo();
    }
}
class Contact extends Model{
    public function stars(){
        return $this->morphMany(Star::class, 'starrable');
    }
}

class Event extends Model{
    public function stars(){
        return $this->morphMany(Star::class, 'starrable');
    }
}

示例8-44 從多型關係中獲取例項

$contact = Contact::first();
$contact->stars->each(function($star){
    //
});

示例8-45 從多型例項中獲取目標

$stars = Star::all();
$stars->each(function($star){
    var_dump($star->starrable);
});

示例8-46 繼承多型系統來區分使用者

class star extends Model{
    public function starrable(){
        return $this->morphosTo;
    }
    public function user(){
        return $this->belongsTo(User::class)l
    }
}

class User extends Model{
    public function stars(){
        return $this->hasMany(Star::class);
    }
}

示例8-47 定義多對多的多型狀態

class Contact extends Model{
    public function tags(){
        return $this->morphToMany(Tag::class. 'taggable');
    }
}
class Event extends Model{
    public function tags(){
        return $this->morphToMany(Tag::class, 'taggable')
    }
}

class Tag extends Model{
    public function contacts(){
        return $this->morphedByMany(Contact::class, 'taggable');
    }

    public function events(){
        return $this->morphedByMany(Event::class, 'taggable');
    }
}

示例8-48 從多對多多型關係雙向訪問關聯條目

$contact = Contact::first();
$contact->tags->each(function($tag){
    //
});

$tag = Tag::first();
$tag->contacts->each(function($contact){
    //
});

示例8-49 同步更新父類和子類記錄

class PhoneNumber extends Model{
    protected $touches = ['contact'];
    public function contact(){
        return $this->belongsTo(Contact::class);
    }
}

示例8-50

$contacts = Contact::all();

foreach ($contacts as $contact){
    foreach($contact->phone_numbers as $phone_number){
        echo $phone_number->number;
    }
}

示例8-51 為 Eloquent事件繫結監聽器

class AppServerProvider extends ServiceProvider{
    public function boot(){
        $thirdPartyService = new SomeThirdPartyService;
        Contact::creating(function($contact) use ($thirdPartyService){
            try{
                $thirdPartyService->addContact($contact);
            }catch(Exception $e){
                Log::error('Failed adding contact to thirdPartyService; cancelled.');

                return false;
            }

        });
    }
}

相關推薦

Laravel入門實戰示例程式碼----資料庫Eloquent

示例8-1 資料庫預設連線列表 'connections' =>[ 'sqlite' => [ 'driver' => 'sqlite', 'database' => database_pat

Docker技術入門實戰 第二版-學習筆記-8-網路功能network-3-容器訪問控制自定義網橋

1)容器訪問控制 容器的訪問控制,主要通過 Linux 上的 iptables防火牆來進行管理和實現。 iptables是 Linux 上預設的防火牆軟體,在大部分發行版中都自帶。   容器訪問外部網路 容器要想訪問

Kubernetes權威指南第2版 Docker技術入門實戰第2版 兩本容器的書下載地址

Docker技術入門與實戰第2版目錄[0第0]2版前言[0第0]1版前言[0第0]一部分 基礎入門[0第0]1章 初識容器與Docker 31.1 什麼是Docker 31.2 為什麼要使用Docker 51.3 Docker與虛擬化 71.4 本章小結 9[0第0]2章 核心概念與安裝配置 102.1 核心

xgboost入門實戰(原理篇)

enc 之前 fine 小結 附近 step 參考 search line http://blog.csdn.net/sb19931201/article/details/52557382 xgboost入門與實戰(原理篇) 前言: xgboost是大規模並行booste

CK2020微信小程序入門實戰 常用組件API開發技巧項目實戰

註冊 form 項目 pack filesize 記錄 tps http 謝謝 CK2020微信小程序入門與實戰 常用組件API開發技巧項目實戰 新年伊始,學習要趁早,點滴記錄,學習就是進步! 隨筆背景:在很多時候,很多入門不久的朋友都會問我:我是從其他語言轉到程序開發

Docker入門實戰講解

pau spa 個人 開發人員 1.0 創建 依賴 之前 講解 簡述 Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口

2018最新python數據分析入門實戰

.com color tid 實戰 pro nag com forum png 下載地址:百度網盤請添加鏈接描述2018最新python數據分析入門與實戰

移動端App UI 設計入門實戰

初步了解 tar 1-1 邏輯 -s 形式 流程 建立 實戰 第1章 課程介紹本章為課程導學,幫助同學們初步了解UI設計,介紹實戰課程安排,並熟悉產品設計、開發流程,了解如何與其它崗位配合。1-1 導學視頻1-2 產品開發流程 第2章 產品需求解析本章將針對產品需求進行解析

Python3數據科學入門實戰

第7章 python 聚合 數學 nac data- notebook 畫圖 das 第1章 實驗環境的搭建 1-1 導學視頻 1-2 Anaconda和Jupyter notebook介紹 1-3 Anaconda在Mac上的安裝演示 1-4 Anacon

微信小遊戲入門實戰 引爆朋友圈

收獲 第6章 ... 運行 框架搭建 比較 -s 項目 工具 第1章 準備工作(需要ES5,ES6基礎)學員作品演示:https://pan.baidu.com/s/1gEMWzujg72soj0cEUOtJ2A 密碼:uy2n,本章首先介紹課程目標,學習收獲等,然後通過與

單片機入門實戰

連接 引腳 校驗 設置 部分 模擬 控制 usart 復位 此文參考《PIC單片機入門與實戰》張明鋒編著 此書共十一章,介紹了從單片機的結構和指令系統到使用C語言編寫程序實現對外圍設備的控制。 PIC單片機的結構和指令系統 本章目標 了解市面上的單片機種類 單片機的大

2018年最新Python3資料科學入門實戰教程

課程簡介: 這是一個數據驅動的時代,想要從事機器學習、人工智慧、資料探勘等前沿技術,都離不開資料跟蹤,本課程通過Numpy、Pandas進行資料科學計算,通過Seaborn、 Matplotlib進行資料圖形化展示;從實戰角度出發,讓你在資料科學領域邁出重要的一步,開啟Data Scien

微控制器入門實戰

此文參考《PIC微控制器入門與實戰》張明鋒編著 此書共十一章,介紹了從微控制器的結構和指令系統到使用C語言編寫程式實現對外圍裝置的控制。 PIC微控制器的結構和指令系統 本章目標 瞭解市面上的單片機種類 微控制器的大致結構 微控制器如何讀取和執行指令 如何人為的控制微控制器

全網首發 商業級支付寶小程式入門實戰

第1章 課程導學與準備工作 本章主要介紹為何學習支付寶小程式,以及開發支付寶小程式能為我們帶來哪些收穫。之後會為大家介紹本課程內容具體安排,最後給出如何學好這門課程的一些學習建議。希望大家都能通過這門課程,學有所成,學有所歸。 1-1 課程導學

全網首發 商業級支付寶小程序入門實戰

課程 質量 文件 綁定 購物 content 排列 warp 自適應 第1章 課程導學與準備工作 本章主要介紹為何學習支付寶小程序,以及開發支付寶小程序能為我們帶來哪些收獲。之後會為大家介紹本課程內容具體安排,最後給出如何學好這門課程的一些學習建議。希望大家都能通過這

微信小程式入門實戰 常用元件 API 開發技巧 專案實戰

      開始就以專案為出發點,不會講一大堆枯燥的語法再補充兩個案例了事,將帶你快速熟悉小程式基礎知識,然後直接進入實戰開發環節,將小程式的知識點貫穿在整個專案中        課程不僅僅講解小程式開發,更會通過實際的編碼來

Python資料探勘入門實戰:第一章

程式碼來源於:https://github.com/hLvMxM/Learning_Data_Mining_with_Python/blob/master/Chapter 1/ch1_affinity.ipynb 其中註釋是在自己學習中加上去的, 便於初學者看懂 分析文字為:affinity

nginx入門實戰

參考:https://www.cnblogs.com/pyyu/p/9468680.html web伺服器軟體  1.一般請求靜態資源是會用到,如圖片,MP4,index頁面 常見的有 IIS (windows底下的web伺服器軟體) Nginx (Linux底下新一代高效能的

Yii2.0框架入門實戰專案開發

Yii2框架入門 1.yii框架介紹 2.yii入門 3.yii框架結構解析 4.控制器 5.模型 6.檢視 7.模組 8.部件 9.路由 10.url解析和生成 11.日誌處理 12.錯誤處理 13.元件 14.屬性 15.事件 16.行為 17.服務定位器

Python3資料科學入門實戰

4-1 DataFrame的簡單數學計算 4-2 Series和DataFrame的排序 4-3 重新命名Dataframe的index 4-4 DataFrame的merge操作 4-5 Concatenate和Combine 4-6 通過apply進行資料預處理 4-7 通過去重進