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 通過去重進