gorm/callbacks.html
2016-02-29 22:59:09 +08:00

728 lines
18 KiB
HTML

<!DOCTYPE HTML>
<html lang="" >
<head>
<title>Callbacks · GORM Guide</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="Callbacks are methods defined on the pointer of struct.
If any callback returns an error, gorm will stop future operations and rollback all changes.">
<meta name="generator" content="GitBook 3.0.0-pre.1">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="advanced.html" />
<link rel="prev" href="curd.html" />
</head>
<body>
<div class="book"
data-level="4"
data-chapter-title="Callbacks"
data-filepath="callbacks.md"
data-basepath=""
data-revision="Mon Feb 29 2016 22:57:46 GMT+0800 (CST)"
data-innerlanguage="">
<div class="book-summary">
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="0" data-path="./">
<a href="./">
Getting Started with GORM
</a>
</li>
<li class="chapter " data-level="1" data-path="database.html">
<a href="database.html">
<b>1.</b>
Database
</a>
<ul class="articles">
<li class="chapter " data-level="1.1" data-path="database.html">
<a href="database.html#connecting-to-a-database">
<b>1.1.</b>
Database Connection
</a>
</li>
<li class="chapter " data-level="1.2" data-path="database.html">
<a href="database.html#migration">
<b>1.2.</b>
Migration
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="2" data-path="models.html">
<a href="models.html">
<b>2.</b>
Models
</a>
<ul class="articles">
<li class="chapter " data-level="2.1" data-path="models.html">
<a href="models.html#model-defination">
<b>2.1.</b>
Model Defination
</a>
</li>
<li class="chapter " data-level="2.2" data-path="models.html">
<a href="models.html#conventions-overriding-conventions">
<b>2.2.</b>
Naming Conventions &amp; Overriding
</a>
</li>
<li class="chapter " data-level="2.3" data-path="associations.html">
<a href="associations.html">
<b>2.3.</b>
Associations
</a>
<ul class="articles">
<li class="chapter " data-level="2.3.1" data-path="associations.html">
<a href="associations.html#belongs-to">
<b>2.3.1.</b>
Belongs To
</a>
</li>
<li class="chapter " data-level="2.3.2" data-path="associations.html">
<a href="associations.html#has-one">
<b>2.3.2.</b>
Has One
</a>
</li>
<li class="chapter " data-level="2.3.3" data-path="associations.html">
<a href="associations.html#has-many">
<b>2.3.3.</b>
Has Many
</a>
</li>
<li class="chapter " data-level="2.3.4" data-path="associations.html">
<a href="associations.html#many-to-many">
<b>2.3.4.</b>
Many To Many
</a>
</li>
<li class="chapter " data-level="2.3.5" data-path="associations.html">
<a href="associations.html#polymorphism">
<b>2.3.5.</b>
Polymorphism
</a>
</li>
<li class="chapter " data-level="2.3.6" data-path="associations.html">
<a href="associations.html#association-mode">
<b>2.3.6.</b>
Association Mode
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="chapter " data-level="3" data-path="curd.html">
<a href="curd.html">
<b>3.</b>
CRUD: Reading and Writing Data
</a>
<ul class="articles">
<li class="chapter " data-level="3.1" data-path="curd.html">
<a href="curd.html#create">
<b>3.1.</b>
Create
</a>
</li>
<li class="chapter " data-level="3.2" data-path="curd.html">
<a href="curd.html#query">
<b>3.2.</b>
Query
</a>
</li>
<li class="chapter " data-level="3.3" data-path="curd.html">
<a href="curd.html#preloading">
<b>3.3.</b>
Preloading (Eager Loading)
</a>
</li>
<li class="chapter " data-level="3.4" data-path="curd.html">
<a href="curd.html#update">
<b>3.4.</b>
Update
</a>
</li>
<li class="chapter " data-level="3.5" data-path="curd.html">
<a href="curd.html#delete">
<b>3.5.</b>
Delete / Soft Delete
</a>
</li>
</ul>
</li>
<li class="chapter active" data-level="4" data-path="callbacks.html">
<a href="callbacks.html">
<b>4.</b>
Callbacks
</a>
</li>
<li class="chapter " data-level="5" data-path="advanced.html">
<a href="advanced.html">
<b>5.</b>
Advanced Usage
</a>
<ul class="articles">
<li class="chapter " data-level="5.1" data-path="advanced.html">
<a href="advanced.html#error-handling">
<b>5.1.</b>
Error Handling
</a>
</li>
<li class="chapter " data-level="5.2" data-path="advanced.html">
<a href="advanced.html#transactions">
<b>5.2.</b>
Transactions
</a>
</li>
<li class="chapter " data-level="5.3" data-path="advanced.html">
<a href="advanced.html#sql-builder">
<b>5.3.</b>
Raw SQL &amp; SQL Builder
</a>
</li>
<li class="chapter " data-level="5.4" data-path="advanced.html">
<a href="advanced.html#compose-primary-key">
<b>5.4.</b>
Composite Primary Key
</a>
</li>
<li class="chapter " data-level="5.5" data-path="advanced.html">
<a href="advanced.html#logger">
<b>5.5.</b>
Overriding Logger
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="6" data-path="development.html">
<a href="development.html">
<b>6.</b>
Development
</a>
<ul class="articles">
<li class="chapter " data-level="6.1" data-path="development.html">
<a href="development.html#callbacks">
<b>6.1.</b>
Write Plugins
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="7" data-path="changelog.html">
<a href="changelog.html">
<b>7.</b>
Change Log
</a>
</li>
<li class="divider"></li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="" >Callbacks</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<section class="normal markdown-section">
<h1 id="callbacks">Callbacks</h1>
<!-- toc -->
<ul>
<li><a href="#creating-an-object">Creating An Object</a></li>
<li><a href="#updating-an-object">Updating An Object</a></li>
<li><a href="#destroying-an-object">Destroying An Object</a></li>
<li><a href="#after-find">After Find</a></li>
<li><a href="#example">Example</a></li>
</ul>
<!-- toc stop -->
<p>Callbacks are methods defined on the pointer of struct.
If any callback returns an error, gorm will stop future operations and rollback all changes.</p>
<p>Here is the list of all available callbacks:
(listed in the same order in which they will get called during the respective operations)</p>
<h3 id="creating-an-object">Creating An Object</h3>
<pre><code class="lang-go">BeforeSave
BeforeCreate
<span class="hljs-comment">// save before associations</span>
<span class="hljs-comment">// save self</span>
<span class="hljs-comment">// save after associations</span>
AfterCreate
AfterSave
</code></pre>
<h3 id="updating-an-object">Updating An Object</h3>
<pre><code class="lang-go">BeforeSave
BeforeUpdate
<span class="hljs-comment">// save before associations</span>
<span class="hljs-comment">// save self</span>
<span class="hljs-comment">// save after associations</span>
AfterUpdate
AfterSave
</code></pre>
<h3 id="destroying-an-object">Destroying An Object</h3>
<pre><code class="lang-go">BeforeDelete
<span class="hljs-comment">// delete self</span>
AfterDelete
</code></pre>
<h3 id="after-find">After Find</h3>
<pre><code class="lang-go"><span class="hljs-comment">// load data from database</span>
AfterFind
</code></pre>
<h3 id="example">Example</h3>
<pre><code class="lang-go"><span class="hljs-keyword">func</span> (u *User) BeforeUpdate() (err error) {
<span class="hljs-keyword">if</span> u.readonly() {
err = errors.New(<span class="hljs-string">&quot;read only user&quot;</span>)
}
<span class="hljs-keyword">return</span>
}
<span class="hljs-comment">// Rollback the insertion if user&apos;s id greater than 1000</span>
<span class="hljs-keyword">func</span> (u *User) AfterCreate() (err error) {
<span class="hljs-keyword">if</span> (u.Id &gt; <span class="hljs-number">1000</span>) {
err = errors.New(<span class="hljs-string">&quot;user id is already greater than 1000&quot;</span>)
}
<span class="hljs-keyword">return</span>
}
</code></pre>
<p>Save/delete operations in gorm are running in a transaction.
Changes made in that transaction are not visible unless it is commited.
So if you want to use those changes in your callbacks, you need to run your SQL in the same transaction.
For this Gorm supports passing transactions to callbacks like this:</p>
<pre><code class="lang-go"><span class="hljs-keyword">func</span> (u *User) AfterCreate(tx *gorm.DB) (err error) {
tx.Model(u).Update(<span class="hljs-string">&quot;role&quot;</span>, <span class="hljs-string">&quot;admin&quot;</span>)
<span class="hljs-keyword">return</span>
}
</code></pre>
</section>
</div>
</div>
</div>
<a href="curd.html" class="navigation navigation-prev " aria-label="Previous page: Delete / Soft Delete">
<i class="fa fa-angle-left"></i>
</a>
<a href="advanced.html" class="navigation navigation-next " aria-label="Next page: Advanced Usage">
<i class="fa fa-angle-right"></i>
</a>
</div>
</div>
<script src="gitbook/app.js"></script>
<script src="gitbook/gitbook-plugin-github/plugin.js"></script>
<script src="gitbook/gitbook-plugin-edit-link/plugin.js"></script>
<script src="gitbook/gitbook-plugin-anker-enable/anker.js"></script>
<script src="gitbook/gitbook-plugin-search/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/buttons.js"></script>
<script>
require(["gitbook"], function(gitbook) {
gitbook.start({"fontsettings":{"theme":"night","size":2,"family":"sans"},"toc":{"addClass":true,"className":"toc"},"github":{"url":"https://github.com/jinzhu/gorm"},"edit-link":{"base":"https://github.com/jinzhu/gorm/edit/gh-pages","label":"Edit This Page"},"anker-enable":{},"highlight":{},"search":{"maxIndexSize":1000000},"sharing":{"all":["facebook","google","instapaper","twitter","weibo"],"facebook":true,"google":false,"instapaper":false,"twitter":true,"vk":false,"weibo":false},"theme-default":{"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}}});
});
</script>
</body>
</html>