我用Laravel-目錄別名/模型/模型關(guān)系

現(xiàn)在是2017年2月5日项戴,從開始接觸Laravel也有小一年來了三痰,這篇文章將記錄我使用Laravel的一些新得腰懂。新的想法也將隨時更新到這篇文章中玻粪。

1.目錄別名

1.1說明

在ShenCom他們有一點(diǎn)做的很好隅津,就是把框架外的擴(kuò)展全部放在了一個獨(dú)立的目錄里面,沒有去破壞Laravel框架本身的結(jié)構(gòu)劲室,讓框架保持了原來的特性伦仍,又增加了新的功能。

1-目錄別名.png

1.2用法

1.2.1添加主服務(wù)文件

在 app\Providers\AppServiceProvider的boot方法中添加
App::register("\YaZhou\YaZhouServiceProvider");

1.2.2起別名

compser.json里面增加一個autoload選項很洋。
執(zhí)行命令composer dump-autpload

2.模型(Model)的定義

2.1簡單示例

namespace Yz\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Test extends Model{
    use SoftDeletes;

    protected   $primaryKey  =   "id";  
    protected   $table       =   "test";
    protected   $guarded     =   ["id"];
    public      $timestamps  =   false;
}

2.2代碼說明

protected $table
指定當(dāng)前模型對應(yīng)的數(shù)據(jù)表名充蓝。
protected $primaryKey
指定當(dāng)前數(shù)據(jù)表的主鍵,默認(rèn)id蹲缠。
public $timestamps
默認(rèn)情況下棺克,Eloquent期望created_at和updated_at已經(jīng)存在于數(shù)據(jù)表中,如果你不想要這些Laravel自動管理的列线定,在模型類中設(shè)置$timestamps屬性為false。
protected $guarded/$fillale
在使用create方法保存一個新的模型時确买,所有的Eloquent模型都通過批量賦值(Mass Assignment)進(jìn)行保護(hù)斤讥,需要指定模型的fillableguarded屬性。在fillable里面的都是可以被賦值的(白名單)湾趾,在guarded里面的都是不可以被賦值的(黑名單)芭商,fillable和guarded二選一。
use SoftDeletes
軟刪除搀缠,要求數(shù)據(jù)表中以一個字段“deleted_at”铛楣。被軟刪除的記錄并沒有被真正的刪除,只是在“deleted_at”字段記錄了操作時間艺普。
Model::withTrashed()->...簸州,同時獲取被軟刪除的記錄鉴竭。
Model::onlyTrashed()->...,只獲取被軟刪除的記錄岸浑。
$record->restore();搏存,恢復(fù)被軟刪除的記錄。
$record->forceDelete()矢洲,強(qiáng)制刪除璧眠。
$record-> history() -> forceDelete(),強(qiáng)制刪除所有關(guān)模型读虏。

2.3擴(kuò)展

查詢作用域

作用域允許你定義一個查詢條件的通用集合责静,這樣就可以在應(yīng)用中方便地復(fù)用。詳情參見盖桥,Laravel5.1中文文檔泰演。

3.模型關(guān)系

3.1一對一關(guān)系

3.1.1關(guān)系的定義
namespace Yz\Test\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    //  獲取關(guān)聯(lián)到用戶的手機(jī)
    public function phone(){
        return $this->hasOne("Yz\Test\Models\Phone");
        // 這種寫法默認(rèn)Phone模型中有一個user_id外鍵,默認(rèn)與當(dāng)前模型的id關(guān)聯(lián)

        // return $this->hasOne("Yz\Test\Models\Phone", "user_id");
        // 指定Phone模型中的外鍵葱轩,默認(rèn)與當(dāng)前模型的id關(guān)聯(lián)
        
        // return $this->hasOne("Yz\Test\Models\Phone", "user_id", "id");
        // 指定phone模型的外鍵睦焕,同時指定當(dāng)前模型的關(guān)聯(lián)鍵,推薦使用
    }
}
3.1.2定義關(guān)系的相對關(guān)聯(lián)
namespace Yz\Test\Models;

use Illuminate\Database\Eloquent\Model;

class Phone extends Model{
    public function user(){
        // 找到電話所屬的用戶
        return $this->belongsTo("Yz\Test\Models\User");
        // 默認(rèn)通過當(dāng)前表的user_id去匹配user表的id

        // return $this->belongsTo("Yz\Test\Models\User", "user_id");
        // 指定當(dāng)前表的關(guān)聯(lián)字段靴拱,去與主表的id字段進(jìn)行匹配
        
        // return $this->belongsTo("Yz\Test\Models\User", "user_id", "id");
        // 指定當(dāng)前表的user_id與User表的id進(jìn)行匹配垃喊,推薦使用
    }
}
3.1.3一對一關(guān)系的使用

$phone = User::find(1)->phone;

3.2 一對多關(guān)系

3.2.1關(guān)系的定義
namespace Yz\Test\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model{
    /*博客數(shù)據(jù)*/

    public function comments(){
        // 獲取博客的評論
        return $this->hasMany("Yz\Test\Models\Comment");

        // $this->hasMany("Yz\Test\Models\Comment", "post_id");
        // $this->hasMany("Yz\Test\Models\Comment", "post_id", "id");
    }
}
3.2.2定義關(guān)系的相對關(guān)聯(lián)
namespace Yz\Test\Models;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model{
    /*博客的評論*/

    public function post(){
        return $this->belongsTo("Yz\Test\Models\Post");

        // return $this->belongsTo("Yz\Test\Models\Post", "post_id");
        // return $this->belongsTo("Yz\Test\Models\Post", "post_id", "id");
    }
}
3.2.3一對多關(guān)系的使用
$comments = App\Post::find(1)->comments;
$comments = App\Post::find(1)->comments()->where('title', 'foo')->first();

$comment = App\Comment::find(1);
echo $comment->post->title;

3.3多對多關(guān)系

實現(xiàn)多對多關(guān)系需要一個中間表。比如,一個用戶(user)擁有多種角色(role)牲剃,那么我們就需要一個中間表(user_role)蠢莺。

3.3.1關(guān)系的定義
public function roles(){
        return $this->belongsToMany("Yz\Test\Model\Role");
        // 省略寫法,要求中間表的名字為role_user乌助,且中間表包含role_id和user_id兩個字段
        
        // return $this->belongsToMany("Yz\Test\Models\Role", "user_role");
        // 半完整寫法
        
        // return $this->belongsToMany("Yz\Test\Models\Role", "user_role", "user_id", "role_id");
        // 完整寫法
    }
3.3.2定義關(guān)系的相對關(guān)聯(lián)
namespace Yz\Test\Models;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    // 用戶角色

    public function users()
    {
        // 找到屬于當(dāng)前角色的用戶
        return $this->belongsToMany("Yz\Test\Models\User");

        // return $this->belongsToMany("Yz\Test\Models\User", "user_role");
        // return $this->belongsToMany("Yz\Test\Models\User", "user_role", "role_id", "user_id");
    }
}
3.3.3多對多關(guān)系的使用
$user = App\User::find(1);
foreach ($user->roles as $role) {
    //
}

$roles = App\User::find(1)->roles()->orderBy('name')->get();

3.4插入關(guān)聯(lián)模型

3.4.1插入一個關(guān)聯(lián)模型
$comment = new App\Comment(['message' => 'A new comment.']);
$post = App\Post::find(1);
$comment = $post->comments()->save($comment);
3.4.2插入多個關(guān)聯(lián)模型
$post = App\Post::find(1);
$post->comments()->saveMany([
    new App\Comment(['message' => 'A new comment.']),
    new App\Comment(['message' => 'Another comment.']),
]);

除了save和saveMany方法外,還可以使用create方法陌知,該方法接收屬性數(shù)組他托、創(chuàng)建模型、然后插入數(shù)據(jù)庫仆葡。save和create的不同之處在于save接收整個Eloquent模型實例而create接收原生PHP數(shù)組赏参。

$post = App\Post::find(1);
$comment = $post->comments()->create([
    'message' => 'A new comment.',
]);
3.4.3更新關(guān)聯(lián)模型

更新belongsTo關(guān)聯(lián)的時候,可以使用associate方法沿盅,該方法會在子模型設(shè)置外鍵把篓。

$account = App\Account::find(10);
$user->account()->associate($account);
$user->save();
3.4.4移除關(guān)聯(lián)模型

移除belongsTo關(guān)聯(lián)的時候,可以使用dissociate方法腰涧。該方法在子模型上取消外鍵和關(guān)聯(lián)韧掩。

$user->account()->dissociate();
$user->save();
3.4.5多對多關(guān)系的附加
$user = App\User::find(1);
$user->roles()->attach($roleId);

附加關(guān)聯(lián)關(guān)系到模型,還可以以數(shù)組形式傳遞額外被插入數(shù)據(jù)到中間表:
$user->roles()->attach($roleId, ['expires' => $expires])

3.4.6多對多關(guān)系的移除
// 從指定用戶中移除角色...
$user->roles()->detach($roleId);
// 從指定用戶移除所有角色...
$user->roles()->detach();

為了方便窖铡,attach和detach還接收數(shù)組形式的ID作為輸入疗锐。

$user = App\User::find(1);
$user->roles()->detach([1, 2, 3]);
$user->roles()->attach([1 => ['expires' => $expires], 2, 3]);
3.4.7觸發(fā)父級時間戳

當(dāng)一個模型屬于另外一個時坊谁,例如Comment屬于Post,子模型更新時父模型的時間戳也被更新將很有用窒悔,例如呜袁,當(dāng)Comment模型被更新時,你可能想要”觸發(fā)“創(chuàng)建其所屬模型Post的updated_at時間戳简珠。Eloquent使得這項操作變得簡單阶界,只需要添加包含關(guān)聯(lián)關(guān)系名稱的touches屬性到子模型中即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末聋庵,一起剝皮案震驚了整個濱河市膘融,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祭玉,老刑警劉巖氧映,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脱货,居然都是意外死亡岛都,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門振峻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臼疫,“玉大人,你說我怎么就攤上這事扣孟√痰蹋” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵凤价,是天一觀的道長鸽斟。 經(jīng)常有香客問我,道長利诺,這世上最難降的妖魔是什么富蓄? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮立轧,結(jié)果婚禮上格粪,老公的妹妹穿的比我還像新娘。我一直安慰自己氛改,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布比伏。 她就那樣靜靜地躺著胜卤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赁项。 梳的紋絲不亂的頭發(fā)上葛躏,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天澈段,我揣著相機(jī)與錄音,去河邊找鬼舰攒。 笑死败富,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摩窃。 我是一名探鬼主播兽叮,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猾愿!你這毒婦竟也來了鹦聪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒂秘,失蹤者是張志新(化名)和其女友劉穎泽本,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姻僧,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡规丽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了撇贺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赌莺。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖显熏,靈堂內(nèi)的尸體忽然破棺而出雄嚣,到底是詐尸還是另有隱情,我是刑警寧澤喘蟆,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布缓升,位于F島的核電站,受9級特大地震影響蕴轨,放射性物質(zhì)發(fā)生泄漏港谊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一橙弱、第九天 我趴在偏房一處隱蔽的房頂上張望歧寺。 院中可真熱鬧,春花似錦棘脐、人聲如沸斜筐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顷链。三九已至,卻和暖如春屈梁,著一層夾襖步出監(jiān)牢的瞬間嗤练,已是汗流浹背榛了。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煞抬,地道東北人霜大。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像革答,于是被迫代替她去往敵國和親战坤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容