1. 程式人生 > >laravel5.5 原始碼解析之belongToMany toggle

laravel5.5 原始碼解析之belongToMany toggle

場景

. 多對多的關係中經常需要用到的一種方式
. 例項   Question Model and Follower Model(問題關注者)
  假設點選一個按鈕,則如果使用者已經是關注者,則取消關注 否則成為關注者

分析

1.  belongsToMany 在哪裡實現了toggle?  內部trait實現
class BelongsToMany extends Relation
{
    use Concerns\InteractsWithPivotTable;
}
2.  toggle實現的過程 :
   . 將傳入的引數全部轉成Key為id的陣列 (傳入的引數可能是Model Collection BaseCollection 或者本身就是id 陣列或者字串)
   . 和已經存在的關係(id array)找交集 $detch,交集執行detach
   . 和已經存在的關係(id array)找相對補集  執行attach 
     這裡的實現有點意思  採用的方式是在 解析出來的id array中找$deatch補集
         $attach = array_diff_key($records, array_flip($detach));
  /**
     * Toggles a model (or models) from the parent.
     *
     * Each existing model is detached, and non existing ones are attached.
     *
     * @param  mixed  $ids
     * @param  bool   $touch
     * @return array
     */
    public function toggle($ids, $touch = true)
    {
        $changes
= [ 'attached' => [], 'detached' => [], ]; $records = $this->formatRecordsList($this->parseIds($ids)); // Next, we will determine which IDs should get removed from the join table by // checking which of the given ID/records is in the list of current records
// and removing all of those rows from this "intermediate" joining table. $detach = array_values(array_intersect( $this->newPivotQuery()->pluck($this->relatedPivotKey)->all(), array_keys($records) )); if (count($detach) > 0) { $this->detach($detach, false); $changes['detached'] = $this->castKeys($detach); } // Finally, for all of the records which were not "detached", we'll attach the // records into the intermediate table. Then, we will add those attaches to // this change list and get ready to return these results to the callers. $attach = array_diff_key($records, array_flip($detach)); if (count($attach) > 0) { $this->attach($attach, [], false); $changes['attached'] = array_keys($attach); } // Once we have finished attaching or detaching the records, we will see if we // have done any attaching or detaching, and if we have we will touch these // relationships if they are configured to touch on any database updates. if ($touch && (count($changes['attached']) || count($changes['detached']))) { $this->touchIfTouching(); } return $changes; }

相關推薦

laravel5.5 原始碼解析belongToMany toggle

場景 . 多對多的關係中經常需要用到的一種方式 . 例項 Question Model and Follower Model(問題關注者) 假設點選一個按鈕,則如果使用者已經是關注者,則取消關注 否則成為關注者 分析 1. belongsT

Android框架原始碼解析(四)Picasso

這次要分析的原始碼是 Picasso 2.5.2 ,四年前的版本,用eclipse寫的,但不影響這次我們對其原始碼的分析 地址:https://github.com/square/picasso/tree/picasso-parent-2.5.2 Picasso的簡單使用

Android框架原始碼解析(三)ButterKnife

注:所有分析基於butterknife:8.4.0 原始碼目錄:https://github.com/JakeWharton/butterknife 其中最主要的3個模組是: Butterknife註解處理器https://github.com/JakeWharton/

Android框架原始碼解析(二)OKhttp

原始碼在:https://github.com/square/okhttp 包實在是太多了,OKhttp核心在這塊https://github.com/square/okhttp/tree/master/okhttp 直接匯入Android Studio中即可。 基本使用:

Android框架原始碼解析(一)Volley

前幾天面試CVTE,HR面掛了。讓內部一個學長幫我查看了一下面試官評價,發現二面面試官的評價如下: 廣度OK,但缺乏深究能力,深度與實踐不足 原始碼:只能說流程,細節程式碼不清楚,retrofit和volley都是。 感覺自己一方面:自己面試技巧有待提高吧(框

Android原始碼解析應用程式資源管理器(Asset Manager)的建立過程分析

轉載自:https://blog.csdn.net/luoshengyang/article/details/8791064 我們分析了Android應用程式資源的編譯和打包過程,最終得到的應用程式資源就與應用程式程式碼一起打包在一個APK檔案中。Android應用程式在執行的過程中,是通過一個

Spring-web原始碼解析Filter-OncePerRequestFilter

轉自:  http://blog.csdn.net/ktlifeng/article/details/50630934 基於4.1.7.RELEASE 我們先看一個filter-mapping的配置 

spring原始碼解析AOP原理

一、準備工作   在這裡我先簡單記錄下如何實現一個aop: AOP:【動態代理】 指在程式執行期間動態的將某段程式碼切入到指定方法指定位置進行執行的程式設計方式; 1、匯入aop模組;Spring AOP:(spring-aspects) 2、定義一個業務邏輯類(

Dubbo原始碼解析服務端接收訊息

準備 dubbo 版本:2.5.4 服務端接收訊息流程 Handler鏈路 DubboProtocol private ExchangeServer createServer(URL url) { url = url.addParameterIfAbsent("c

Dubbo原始碼解析服務釋出與註冊

準備 dubbo版本:2.5.4 Spring自定義擴充套件 dubbo 是基於 spring 配置來實現服務釋出,並基於 spring 的擴充套件機制定義了一套自定義標籤,要實現自定義擴充套件, spring 中提供了 NamespaceHandler 、BeanDefinit

MyBatis原始碼解析日誌記錄

一 .概述 MyBatis沒有提供日誌的實現類,需要接入第三方的日誌元件,但第三方日誌元件都有各自的Log級別,且各不相同,但MyBatis統一提供了trace、debug、warn、error四個級別; 自動掃描日誌實現,並且第三方日誌外掛載入優先順序如下:slf4J → commonsLoging →

MyBatis原始碼解析資料來源(含資料庫連線池簡析)

一.概述: 常見的資料來源元件都實現了javax.sql.DataSource介面; MyBatis不但要能整合第三方的資料來源元件,自身也提供了資料來源的實現; 一般情況下,資料來源的初始化過程引數較多,比較複雜; 二.設計模式: 為什麼要使用工廠模式     資料來

Spring原始碼解析 Spring Security啟動細節和工作模式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Laravel原始碼解析反射的使用

前言 PHP的反射類與例項化物件作用相反,例項化是呼叫封裝類中的方法、成員,而反射類則是拆封類中的所有方法、成員變數,幷包括私有方法等。就如“解刨”一樣,我們可以呼叫任何關鍵字修飾的方法、成員。當然在正常業務中是建議不使用,比較反射類已經摒棄了封裝的概念。 本章講解反射類的使用及Laravel對反射的使用

hanlp原始碼解析中文分詞演算法詳解

詞圖 詞圖指的是句子中所有詞可能構成的圖。如果一個詞A的下一個詞可能是B的話,那麼A和B之間具有一條路徑E(A,B)。一個詞可能有多個後續,同時也可能有多個前驅,它們構成的圖我稱作詞圖。 需要稀疏2維矩陣模型,以一個詞的起始位置作為行,終止位置作為列,可以得到一個二維矩陣。例如:“他說的確實

MapReduce原始碼解析Mapper

MapReduce原始碼解析之Mapper 北京易觀智庫網路科技有限公司 作者:賀斌 摘要:詳解MapReduce中Map(對映)的實現者Mapper。 導語: 說起MapReduce,只要是大資料領域的小夥伴,相信都不陌生。它作為Hadoop生態系統中的一部分,最早是由G

高併發程式設計thirft原始碼解析Selector

Selector作用 關於套接字程式設計,有一套經典的IO模型需要提前介紹一下:. 同步IO模型: 阻塞式IO模型 非阻塞式IO模型 IO複用模型   使用selector 訊號驅動式IO模型   非同步IO模型 使用aio_read   thri

Vue原始碼解析nextTick

Vue原始碼解析之nextTick 前言 nextTick是Vue的一個核心功能,在Vue內部實現中也經常用到nextTick。但是,很多新手不理解nextTick的原理,甚至不清楚nextTick的作用。 那麼,我們就先來看看nextTick是什麼。 nextTick功能 看看

vue 原始碼解析 data的省略用法

var vu = new vue( { data() { name: kk age: 123 } }) vue中獲取 name 有如下幾種寫法, 1 vu.name 2 vu.$data.name 其實他們實際都是獲取的 vu._data.name 第一種的原始碼在 function initDa

Dubbo原始碼解析LoadBalance負載均衡

閱讀須知 dubbo版本:2.6.0 spring版本:4.3.8 文章中使用/* */註釋的方法會做深入分析 正文 dubbo一共支援四種負載均衡策略,RoundRobinLoadBalance(輪詢)、RandomLoadBalance(隨機)、