1119 lines
76 KiB
HTML
1119 lines
76 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
<html>
|
||
|
||
<head>
|
||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
|
||
<title>QxOrm : C++ Qt ORM Object Relational Mapping database library - QxEntityEditor : C++ Qt entities graphic
|
||
editor (data model designer and source code generator)</title>
|
||
<link rel='stylesheet' type='text/css' href='./resource/qxorm_style.css'>
|
||
<script type="text/javascript" src="./resource/jquery.min.js"></script>
|
||
<script type="text/javascript" src="./resource/qxorm_script.js"></script>
|
||
</head>
|
||
|
||
<body>
|
||
<table border="0" style="width: 80%" align="center">
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td><a href="./home.html"><img alt="QxOrm" src="./resource/logo_qxorm_and_qxee.png" align="left"
|
||
border="0"></a></td>
|
||
<td align="right" style="vertical-align:bottom">
|
||
<div id="qx_search">
|
||
<gcse:search></gcse:search>
|
||
</div>
|
||
</td>
|
||
<td width="15"></td>
|
||
<td align="right" style="vertical-align:bottom">
|
||
<img alt="Windows" src="./resource/logo_windows.gif" width="35" height="35">
|
||
<img alt="Linux" src="./resource/logo_linux.gif" width="35" height="35">
|
||
<img alt="Macintosh" src="./resource/logo_mac.gif" width="35" height="35">
|
||
</td>
|
||
<td width="70"><img alt="C++" src="./resource/logo_cpp.gif" width="50" height="50" align="right"></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<hr style="width: 80%" align="center" size="1" color="#100D5A">
|
||
<table border="0" style="width: 80%" align="center">
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td align="center"><a href="./home.html" class="btn_nav">Home</a></td>
|
||
<td align="center"><a href="./download.html" class="btn_nav">Download</a></td>
|
||
<td align="center"><a href="./quick_sample.html" class="btn_nav">Quick sample</a></td>
|
||
<td align="center" onmouseover="showHideElementById('menu_tuto', true);"
|
||
onmouseout="showHideElementById('menu_tuto', false);">
|
||
<a href="./tutorial.html" class="btn_nav">Tutorial (4)</a>
|
||
<table class="table_menu_tuto">
|
||
<tbody>
|
||
<tr>
|
||
<td>
|
||
<div id="menu_tuto" class="div_menu_tuto">
|
||
<a href="./tutorial_3.html" class="btn_sub_menu">install QxOrm</a><br />
|
||
<a href="./tutorial.html" class="btn_sub_menu">qxBlog</a><br />
|
||
<a href="./tutorial_2.html" class="btn_sub_menu">qxClientServer</a><br />
|
||
<a href="./tutorial_4.html" class="btn_sub_menu">QxEntityEditor videos</a>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</td>
|
||
<td align="center" onmouseover="showHideElementById('menu_manual', true);"
|
||
onmouseout="showHideElementById('menu_manual', false);">
|
||
<a href="./manual.html" class="btn_nav">Manual (2)</a>
|
||
<table class="table_menu_manual">
|
||
<tbody>
|
||
<tr>
|
||
<td>
|
||
<div id="menu_manual" class="div_menu_manual">
|
||
<a href="./manual.html" class="btn_sub_menu">QxOrm manual</a><br />
|
||
<a href="./manual_qxee.html" class="btn_sub_menu">QxEntityEditor manual</a><br />
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</td>
|
||
<td align="center"><a href="./link.html" class="btn_nav">Forum</a></td>
|
||
<td align="center"><a href="./customer.html" class="btn_nav">Our customers</a></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<hr style="width: 80%" align="center" size="1" color="#100D5A">
|
||
<table border="0" style="width: 80%" align="center">
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td align="left" valign="top">
|
||
<font size="2" class="txt_with_shadow">QxOrm >> Tutorial >> qxBlog</font>
|
||
</td>
|
||
<td align="right" valign="top">
|
||
<table cellspacing="0" cellpadding="1">
|
||
<col>
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td align="right" valign="top">
|
||
<font size="2" class="txt_with_shadow">Current version : </font>
|
||
</td>
|
||
<td align="left" valign="top">
|
||
<font size="2" class="txt_with_shadow">QxOrm 1.5.0 - <a href="../doxygen/index.html"
|
||
target="_blank">QxOrm library online class documentation</a> - <a
|
||
href="https://github.com/QxOrm/QxOrm" target="_blank">GitHub</a></font>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="right" valign="top">
|
||
<font size="2" class="txt_with_shadow"></font>
|
||
</td>
|
||
<td align="left" valign="top">
|
||
<font size="2" class="txt_with_shadow">QxEntityEditor 1.2.8</font>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</td>
|
||
<td width="10px"></td>
|
||
<td width="40px" height="30px"><a href="../qxorm_fr/tutorial.html"><img alt="Version fran<61>aise du site"
|
||
src="./resource/FR.png" width="40" height="30" border="0"></a></td>
|
||
<td width="40px" height="30px"><a href="../qxorm_en/tutorial.html"><img alt="Web site english version"
|
||
src="./resource/GB.png" width="40" height="30" border="0"></a></td>
|
||
<td width="40px" height="30px"><a href="http://sites.google.com/site/qxormpostgres/" target="_blank"><img
|
||
alt="" src="./resource/ES.png" width="40" height="30" border="0"></a></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<table border="1" frame="vsides" rules="cols" style="width: 80%" align="center" cellpadding="6" bgcolor="#F2F2F4">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td align="justify">
|
||
<table border="0" cellpadding="4">
|
||
<col>
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td>
|
||
<font class="txt_with_shadow" color="#0B0B61" size="4"><i>Select a tutorial : </i></font>
|
||
</td>
|
||
<td align="left">
|
||
<a href="./tutorial.html" class="btn_tuto_selected">Tuto n<>1 : qxBlog</a>
|
||
<a href="./tutorial_2.html" class="btn_tuto">Tuto n<>2 : qxClientServer</a>
|
||
<a href="./tutorial_3.html" class="btn_tuto">Tuto n<>3 : install QxOrm</a>
|
||
<a href="./tutorial_4.html" class="btn_tuto">Tuto n<>4 : video QxEntityEditor</a>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<hr style="width: 100%" align="center" size="1" color="#100D5A">
|
||
<br>
|
||
<table border="0" style="width: 100%" align="center">
|
||
<col>
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td>In this chapter, we will see several features of <b>QxOrm</b> library with the creation of a
|
||
C++ project : <b>qxBlog - blog management in C++</b>.<br>
|
||
<b>qxBlog</b> tutorial step by step :
|
||
<ul>
|
||
<li><a href="#tuto_1">1- <b>qxBlog</b> project - blog management in C++</a></li>
|
||
<li><a href="#tuto_2">2- all files in <b>qxBlog</b> project</a></li>
|
||
<li><a href="#tuto_3">3- <i>qxBlog.pro</i> file</a></li>
|
||
<li><a href="#tuto_4">4- <i>export.h</i> file</a></li>
|
||
<li><a href="#tuto_5">5- <i>precompiled.h</i> file</a></li>
|
||
<li><a href="#tuto_6">6- <i>author.h</i> and <i>author.cpp</i> (relationship
|
||
<i>one-to-many</i>)</a></li>
|
||
<li><a href="#tuto_7">7- <i>comment.h</i> and <i>comment.cpp</i> (relationship
|
||
<i>many-to-one</i>)</a></li>
|
||
<li><a href="#tuto_8">8- <i>category.h</i> and <i>category.cpp</i> (relationship
|
||
<i>many-to-many</i>)</a></li>
|
||
<li><a href="#tuto_9">9- <i>blog.h</i> and <i>blog.cpp</i> (relationship
|
||
<i>one-to-many</i>, <i>many-to-one</i> and <i>many-to-many</i>)</a></li>
|
||
<li><a href="#tuto_10">10- <i>main.cpp</i> file</a></li>
|
||
<li><a href="#tuto_11">11- relationship <i>one-to-one</i> with <i>person</i> class</a>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
<td width="200" align="center" valign="top"><a href="./resource/qt_ambassador_logo.png"
|
||
target="_blank"><img alt="qt_ambassador" src="./resource/qt_ambassador_logo_150x150.png"
|
||
width="150" height="150" border="0"></a><br>
|
||
<b>
|
||
<font size="2">QxOrm library has been accepted into the <a
|
||
href="http://forum.qt.io/category/24/qt-ambassador-program" target="_blank">Qt
|
||
Ambassador Program</a></font>
|
||
</b>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<i>Note :</i> there is a similar project in '<i>./test/qxBlogCompositeKey/</i>' directory to show how to
|
||
define an id with multi-columns in database (<i>composite key</i>).<br>
|
||
For more details about '<i>multi-columns primary key</i>' : <a
|
||
href="../qxorm_en/manual.html#manual_3010">read the manual here</a>.<br>
|
||
<br><br>
|
||
<a name="tuto_1"><u>
|
||
<font color="#100D5A">1- <b>qxBlog</b> project - blog management in C++ :</font>
|
||
</u></a>
|
||
<ul>
|
||
<li><b>blog</b> : 1 <i>blog</i> is written by 1 <i>author</i>, can have many <i>comment</i> and can be
|
||
put inside many <i>category</i>
|
||
</li>
|
||
<li><b>author</b> : 1 <i>author</i> can write many <i>blog</i>
|
||
</li>
|
||
<li><b>comment</b> : 1 <i>comment</i> belongs to 1 <i>blog</i>
|
||
</li>
|
||
<li><b>category</b> : 1 <i>category</i> contains many <i>blog</i>
|
||
</li>
|
||
</ul>
|
||
<br>
|
||
<a name="tuto_2"><u>
|
||
<font color="#100D5A">2- all files in <b>qxBlog</b> project :</font>
|
||
</u></a><br>
|
||
<br>
|
||
<table border="1" style="width: 100%" bgcolor="#FFFFFF">
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td><i>./qxBlog/ <br>
|
||
./qxBlog/qxBlog.pro <br>
|
||
./qxBlog/qxBlog.sqlite </i> </td>
|
||
<td><i>./qxBlog/include/precompiled.h <br>
|
||
./qxBlog/include/export.h <br>
|
||
./qxBlog/include/author.h <br>
|
||
./qxBlog/include/blog.h <br>
|
||
./qxBlog/include/category.h <br>
|
||
./qxBlog/include/comment.h </i> </td>
|
||
<td><i>./qxBlog/src/author.cpp <br>
|
||
./qxBlog/src/blog.cpp <br>
|
||
./qxBlog/src/category.cpp <br>
|
||
./qxBlog/src/comment.cpp <br>
|
||
./qxBlog/src/main.cpp </i> </td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><i>Note</i> : tutorial source code is available in
|
||
<i>./test/qxBlog/</i> folder of your <b>QxOrm</b> package.<br>
|
||
<i>qxBlog.sqlite</i> file is the tutorial database in the format <a href="http://sqlite.org/"
|
||
target="_blank"><i>SQLite</i></a>.
|
||
</p>
|
||
<p><br>
|
||
<a name="tuto_3"><u>
|
||
<font color="#100D5A">3- <i>qxBlog.pro</i> file :</font>
|
||
</u></a><br>
|
||
<br>
|
||
This file is necessary to compile and build the project with the command <i>qmake</i>
|
||
provided by Qt library. <br>
|
||
The tool <i>qmake</i> is multi-platform, so <b>qxBlog</b> project can be compiled under Windows,
|
||
Linux, Mac OS X, etc...
|
||
<br>
|
||
The file <i>qxBlog.pro</i> contains the list of all files in the project (header + source) and all
|
||
dependencies
|
||
(<i>QxOrm.pri</i> file contains all dependencies with boost and Qt libraries).<br>
|
||
<i>qxBlog.pro</i> contains an important constant (<b><i>_BUILDING_QX_BLOG</i></b>) to know if the
|
||
project is compiling (cf. <i>export.h</i> and DLL mechanism under Windows to import or export
|
||
functions, classes...).
|
||
</p>
|
||
<p><a href="./resource/qxBlog.qxBlog.pro"><img alt="qxBlog.pro" src="./resource/qxBlog.pro.jpg"
|
||
width="417" height="551" border="0"></a></p>
|
||
<p><br>
|
||
<a name="tuto_4"><u>
|
||
<font color="#100D5A">4- <i>export.h</i> file :</font>
|
||
</u></a><br>
|
||
<br>
|
||
A <i>DLL</i> Windows needs this file to manage <i>'export/import'</i> of classes, functions... <br>
|
||
<b>QxOrm</b> uses the same mechanism to provide some functionalities :
|
||
so the file <i>export.h</i> is necessary to all projects using <b>QxOrm</b> library.<br><br>
|
||
<i>Note</i> : quick resume of DLL mechanism under Windows :
|
||
</p>
|
||
<ul>
|
||
<li>when a DLL is compiling, each class is exported</li>
|
||
<li>when another DLL is compiling, each class of the first DLL needs to be imported to be used</li>
|
||
</ul><br>
|
||
<table border="1" bgcolor="#FFFFFF">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td title="export.h">
|
||
<pre><span class="pre">#ifndef _QX_BLOG_EXPORT_H_
|
||
#define _QX_BLOG_EXPORT_H_
|
||
|
||
#ifdef _BUILDING_QX_BLOG
|
||
#define QX_BLOG_DLL_EXPORT QX_DLL_EXPORT_HELPER
|
||
#else <span class="comment">// _BUILDING_QX_BLOG</span>
|
||
#define QX_BLOG_DLL_EXPORT QX_DLL_IMPORT_HELPER
|
||
#endif <span class="comment">// _BUILDING_QX_BLOG</span>
|
||
|
||
#ifdef _BUILDING_QX_BLOG
|
||
#define QX_REGISTER_HPP_QX_BLOG QX_REGISTER_HPP_EXPORT_DLL
|
||
#define QX_REGISTER_CPP_QX_BLOG QX_REGISTER_CPP_EXPORT_DLL
|
||
#else <span class="comment">// _BUILDING_QX_BLOG</span>
|
||
#define QX_REGISTER_HPP_QX_BLOG QX_REGISTER_HPP_IMPORT_DLL
|
||
#define QX_REGISTER_CPP_QX_BLOG QX_REGISTER_CPP_IMPORT_DLL
|
||
#endif <span class="comment">// _BUILDING_QX_BLOG</span>
|
||
|
||
#endif <span class="comment">// _QX_BLOG_EXPORT_H_</span>
|
||
</span></pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br><br>
|
||
<a name="tuto_5"><u>
|
||
<font color="#100D5A">5- <i>precompiled.h</i> file :</font>
|
||
</u></a><br>
|
||
<br>
|
||
<i>precompiled header</i> file reduces compilation times of a C++ project.<br>
|
||
<b>QxOrm</b> uses <b>meta-programming</b> concept to provide a lot of functionalities.<br>
|
||
<b>meta-programming</b> is costly in compilation times, so your project will be compiled much more
|
||
quickly with the file
|
||
<i>precompiled.h</i>.<br><br>
|
||
Last but not least, another advantage is that the file <i>QxOrm.h</i> includes the basic functionalities
|
||
of libraries boost and Qt.<br>
|
||
It is thus not necessary anymore to write <i>#include <QtCore/QString.h></i> to use the class
|
||
QString of Qt for example.<br>
|
||
In the same way, there is no need anymore to write <i>#include <boost/shared_ptr.hpp></i> to use
|
||
smart pointers of boost library.<br>
|
||
<br>
|
||
<table border="1" bgcolor="#FFFFFF">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td title="precompiled.h">
|
||
<pre><span class="pre">#ifndef _QX_BLOG_PRECOMPILED_HEADER_H_
|
||
#define _QX_BLOG_PRECOMPILED_HEADER_H_
|
||
|
||
#include <span class="string"><QxOrm.h></span>
|
||
|
||
#include <span class="string">"export.h"</span>
|
||
|
||
#endif <span class="comment">// _QX_BLOG_PRECOMPILED_HEADER_H_</span>
|
||
</span></pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br><br>
|
||
<a name="tuto_6"><u>
|
||
<font color="#100D5A">6- <i>author.h</i> and <i>author.cpp</i> (relationship <i>one-to-many</i>) :
|
||
</font>
|
||
</u></a><br>
|
||
<br>
|
||
1 <i>author</i> can write many <i>blog</i>
|
||
: we will see how to use relationship <b><i>one-to-many</i></b>. <br>
|
||
In the database, there is 2 tables : <br>
|
||
<br>
|
||
<img alt="qxBlog.table.author" src="./resource/qxBlog.table.author.jpg" width="318" height="118"><br>
|
||
<br>
|
||
In the C++ source code, the properties of <i>author</i> class belong to columns of <i>author</i> table in
|
||
the database. <br>
|
||
So 1 instance of <i>author</i> class in the C++ source code belong to 1 row of <i>author</i> table in the
|
||
database. <br>
|
||
This mechanism provides C++ source code easy to develop and to maintain.<br>
|
||
<br>
|
||
We add 1 method to our <i>author</i> class : <i>int age()</i> to retrieve the age with the data returned
|
||
by the database.<br>
|
||
We define also 2 <i>typedef</i> : a <i>smart-pointer</i> to an object <i>author</i>, and a list of
|
||
<i>author</i>.<br>
|
||
<i>author</i> class need an id of <i>QString</i> type (by default, <b>QxOrm</b> provides id of
|
||
<i>long</i> type) : we use the macro <b><i>QX_REGISTER_PRIMARY_KEY(author, QString)</i></b> to specialize
|
||
the template.<br>
|
||
<br>
|
||
<table border="1" bgcolor="#FFFFFF">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td title="author.h">
|
||
<pre><span class="pre">#ifndef _QX_BLOG_AUTHOR_H_
|
||
#define _QX_BLOG_AUTHOR_H_
|
||
</span><span class="keyword">
|
||
class</span> blog<span class="operator">;</span><span class="keyword">
|
||
|
||
class</span> QX_BLOG_DLL_EXPORT author<span class="operator">
|
||
{</span><span class="keyword">
|
||
public</span><span class="operator">:</span><span class="comment">
|
||
// -- typedef
|
||
</span><span class="keyword"> typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator"><</span>blog<span class="operator">></span> blog_ptr<span class="operator">;</span><span class="keyword">
|
||
typedef</span> std<span class="operator">::</span>vector<span class="operator"><</span>blog_ptr<span class="operator">></span> list_blog<span class="operator">;</span><span class="comment">
|
||
// -- enum
|
||
</span><span class="keyword"> enum</span> enum_sex<span class="operator"> {</span> male<span class="operator">,</span> female<span class="operator">,</span> unknown<span class="operator"> };</span><span class="comment">
|
||
// -- properties
|
||
</span> QString m_id<span class="operator">;</span>
|
||
QString m_name<span class="operator">;</span>
|
||
QDate m_birthdate<span class="operator">;</span>
|
||
enum_sex m_sex<span class="operator">;</span>
|
||
list_blog m_blogX<span class="operator">;</span><span class="comment">
|
||
// -- contructor, virtual destructor
|
||
</span> author<span class="operator">() :</span> m_id<span class="operator">(</span><span class="int">0</span><span class="operator">),</span> m_sex<span class="operator">(</span>unknown<span class="operator">) { ; }</span><span class="keyword">
|
||
virtual</span><span class="operator"> ~</span>author<span class="operator">() { ; }</span><span class="comment">
|
||
// -- methods
|
||
</span><span class="type"> int</span> age<span class="operator">()</span><span class="keyword"> const</span><span class="operator">;
|
||
};</span>
|
||
|
||
QX_REGISTER_PRIMARY_KEY<span class="operator">(</span>author<span class="operator">,</span> QString<span class="operator">)</span>
|
||
QX_REGISTER_HPP_QX_BLOG<span class="operator">(</span>author<span class="operator">,</span> qx<span class="operator">::</span>trait<span class="operator">::</span>no_base_class_defined<span class="operator">,</span><span class="int"> 0</span><span class="operator">)</span><span class="keyword">
|
||
|
||
typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator"><</span>author<span class="operator">></span> author_ptr<span class="operator">;</span><span class="keyword">
|
||
typedef</span> qx<span class="operator">::</span>QxCollection<span class="operator"><</span>QString<span class="operator">,</span> author_ptr<span class="operator">></span> list_author<span class="operator">;</span><span class="pre">
|
||
|
||
#endif <span class="comment">// _QX_BLOG_AUTHOR_H_</span>
|
||
</span></pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br>
|
||
<table border="1" bgcolor="#FFFFFF">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td title="author.cpp">
|
||
<pre><span class="pre">#include <span class="string">"../include/precompiled.h"</span>
|
||
|
||
#include <span class="string">"../include/author.h"</span>
|
||
#include <span class="string">"../include/blog.h"</span>
|
||
|
||
#include <span class="string"><QxOrm_Impl.h></span>
|
||
</span>
|
||
QX_REGISTER_CPP_QX_BLOG<span class="operator">(</span>author<span class="operator">)</span><span class="keyword">
|
||
|
||
namespace</span> qx<span class="operator"> {</span><span class="keyword">
|
||
template</span><span class="operator"> <></span><span class="type"> void</span> register_class<span class="operator">(</span>QxClass<span class="operator"><</span>author<span class="operator">> &</span> t<span class="operator">)
|
||
{</span>
|
||
t<span class="operator">.</span>id<span class="operator">(&</span> author<span class="operator">::</span>m_id<span class="operator">,</span><span class="string"> "author_id"</span><span class="operator">);</span>
|
||
|
||
t<span class="operator">.</span>data<span class="operator">(&</span> author<span class="operator">::</span>m_name<span class="operator">,</span><span class="string"> "name"</span><span class="operator">);</span>
|
||
t<span class="operator">.</span>data<span class="operator">(&</span> author<span class="operator">::</span>m_birthdate<span class="operator">,</span><span class="string"> "birthdate"</span><span class="operator">);</span>
|
||
t<span class="operator">.</span>data<span class="operator">(&</span> author<span class="operator">::</span>m_sex<span class="operator">,</span><span class="string"> "sex"</span><span class="operator">);</span>
|
||
|
||
t<span class="operator">.</span>relationOneToMany<span class="operator">(&</span> author<span class="operator">::</span>m_blogX<span class="operator">,</span><span class="string"> "list_blog"</span><span class="operator">,</span><span class="string"> "author_id"</span><span class="operator">);</span>
|
||
|
||
t<span class="operator">.</span>fct_0<span class="operator"><</span><span class="type">int</span><span class="operator">>(&</span> author<span class="operator">::</span>age<span class="operator">,</span><span class="string"> "age"</span><span class="operator">);
|
||
}}</span><span class="type">
|
||
|
||
int</span> author<span class="operator">::</span>age<span class="operator">()</span><span class="keyword"> const</span><span class="operator">
|
||
{</span><span class="flow">
|
||
if</span><span class="operator"> (!</span> m_birthdate<span class="operator">.</span>isValid<span class="operator">()) {</span><span class="flow"> return</span><span class="operator"> -</span><span class="int">1</span><span class="operator">; }</span><span class="flow">
|
||
return</span><span class="operator"> (</span>QDate<span class="operator">::</span>currentDate<span class="operator">().</span>year<span class="operator">() -</span> m_birthdate<span class="operator">.</span>year<span class="operator">());
|
||
}</span>
|
||
</pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br><br>
|
||
<a name="tuto_7"><u>
|
||
<font color="#100D5A">7- <i>comment.h</i> and <i>comment.cpp</i> (relationship <i>many-to-one</i>)
|
||
:</font>
|
||
</u></a><br>
|
||
<br>
|
||
1 <i>comment</i> belongs to 1 <i>blog</i> and 1 <i>blog</i> can contain many <i>comment</i> : we will see
|
||
how to use relationship <b><i>many-to-one</i></b>. <br>
|
||
In the database, there is 2 tables : <br>
|
||
<br>
|
||
<img alt="qxBlog.table.comment" src="./resource/qxBlog.table.comment.jpg" width="335" height="116"><br>
|
||
<br>
|
||
Like <i>author</i> class, we define 2 <i>typedef</i> : a <i>smart-pointer</i> to a <i>comment</i> object
|
||
and a list of <i>comment</i>.<br>
|
||
<br>
|
||
<table border="1" bgcolor="#FFFFFF">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td title="comment.h">
|
||
<pre><span class="pre">#ifndef _QX_BLOG_COMMENT_H_
|
||
#define _QX_BLOG_COMMENT_H_
|
||
</span><span class="keyword">
|
||
class</span> blog<span class="operator">;</span><span class="keyword">
|
||
|
||
class</span> QX_BLOG_DLL_EXPORT comment<span class="operator">
|
||
{</span><span class="keyword">
|
||
public</span><span class="operator">:</span><span class="comment">
|
||
// -- typedef
|
||
</span><span class="keyword"> typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator"><</span>blog<span class="operator">></span> blog_ptr<span class="operator">;</span><span class="comment">
|
||
// -- properties
|
||
</span><span class="type"> long</span> m_id<span class="operator">;</span>
|
||
QString m_text<span class="operator">;</span>
|
||
QDateTime m_dt_create<span class="operator">;</span>
|
||
blog_ptr m_blog<span class="operator">;</span><span class="comment">
|
||
// -- contructor, virtual destructor
|
||
</span> comment<span class="operator">() :</span> m_id<span class="operator">(</span><span class="int">0</span><span class="operator">) { ; }</span><span class="keyword">
|
||
virtual</span><span class="operator"> ~</span>comment<span class="operator">() { ; }
|
||
};</span>
|
||
|
||
QX_REGISTER_HPP_QX_BLOG<span class="operator">(</span>comment<span class="operator">,</span> qx<span class="operator">::</span>trait<span class="operator">::</span>no_base_class_defined<span class="operator">,</span><span class="int"> 0</span><span class="operator">)</span><span class="keyword">
|
||
|
||
typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator"><</span>comment<span class="operator">></span> comment_ptr<span class="operator">;</span><span class="keyword">
|
||
typedef</span> QList<span class="operator"><</span>comment_ptr<span class="operator">></span> list_comment<span class="operator">;</span><span class="pre">
|
||
|
||
#endif <span class="comment">// _QX_BLOG_COMMENT_H_</span>
|
||
</span></pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br>
|
||
<table border="1" bgcolor="#FFFFFF">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td title="comment.cpp">
|
||
<pre><span class="pre">#include <span class="string">"../include/precompiled.h"</span>
|
||
|
||
#include <span class="string">"../include/comment.h"</span>
|
||
#include <span class="string">"../include/blog.h"</span>
|
||
|
||
#include <span class="string"><QxOrm_Impl.h></span>
|
||
</span>
|
||
QX_REGISTER_CPP_QX_BLOG<span class="operator">(</span>comment<span class="operator">)</span><span class="keyword">
|
||
|
||
namespace</span> qx<span class="operator"> {</span><span class="keyword">
|
||
template</span><span class="operator"> <></span><span class="type"> void</span> register_class<span class="operator">(</span>QxClass<span class="operator"><</span>comment<span class="operator">> &</span> t<span class="operator">)
|
||
{</span>
|
||
t<span class="operator">.</span>id<span class="operator">(&</span> comment<span class="operator">::</span>m_id<span class="operator">,</span><span class="string"> "comment_id"</span><span class="operator">);</span>
|
||
|
||
t<span class="operator">.</span>data<span class="operator">(&</span> comment<span class="operator">::</span>m_text<span class="operator">,</span><span class="string"> "comment_text"</span><span class="operator">);</span>
|
||
t<span class="operator">.</span>data<span class="operator">(&</span> comment<span class="operator">::</span>m_dt_create<span class="operator">,</span><span class="string"> "date_creation"</span><span class="operator">);</span>
|
||
|
||
t<span class="operator">.</span>relationManyToOne<span class="operator">(&</span> comment<span class="operator">::</span>m_blog<span class="operator">,</span><span class="string"> "blog_id"</span><span class="operator">);
|
||
}}</span>
|
||
</pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br>
|
||
<br>
|
||
<a name="tuto_8"><u>
|
||
<font color="#100D5A">8- <i>category.h</i> and <i>category.cpp</i> (relationship
|
||
<i>many-to-many</i>) :
|
||
</font>
|
||
</u></a><br>
|
||
<br>
|
||
1 <i>category</i> contains many <i>blog</i> and 1 <i>blog</i> can be put inside many <i>category</i> :
|
||
we will see how to use relationship <b><i>many-to-many</i></b>.<br>
|
||
This kind of relationship need a new table in the database to save the list of <i>id</i> for each
|
||
relationship.<br>
|
||
So in the database, there is 3 tables : <br>
|
||
<br>
|
||
<img alt="qxBlog.table.category" src="./resource/qxBlog.table.category.jpg" width="464" height="115"><br>
|
||
<br>
|
||
Like <i>author</i> class and <i>comment</i> class, we define 2 <i>typedef</i> :
|
||
a <i>smart-pointer</i> to a <i>category</i> object and a list of <i>category</i>.<br>
|
||
<br>
|
||
<table border="1" bgcolor="#FFFFFF">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td title="category.h">
|
||
<pre><span class="pre">#ifndef _QX_BLOG_CATEGORY_H_
|
||
#define _QX_BLOG_CATEGORY_H_
|
||
</span><span class="keyword">
|
||
class</span> blog<span class="operator">;</span><span class="keyword">
|
||
|
||
class</span> QX_BLOG_DLL_EXPORT category<span class="operator">
|
||
{</span><span class="keyword">
|
||
public</span><span class="operator">:</span><span class="comment">
|
||
// -- typedef
|
||
</span><span class="keyword"> typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator"><</span>blog<span class="operator">></span> blog_ptr<span class="operator">;</span><span class="keyword">
|
||
typedef</span> qx<span class="operator">::</span>QxCollection<span class="operator"><</span><span class="type">long</span><span class="operator">,</span> blog_ptr<span class="operator">></span> list_blog<span class="operator">;</span><span class="comment">
|
||
// -- properties
|
||
</span><span class="type"> long</span> m_id<span class="operator">;</span>
|
||
QString m_name<span class="operator">;</span>
|
||
QString m_desc<span class="operator">;</span>
|
||
list_blog m_blogX<span class="operator">;</span><span class="comment">
|
||
// -- contructor, virtual destructor
|
||
</span> category<span class="operator">() :</span> m_id<span class="operator">(</span><span class="int">0</span><span class="operator">) { ; }</span><span class="keyword">
|
||
virtual</span><span class="operator"> ~</span>category<span class="operator">() { ; }
|
||
};</span>
|
||
|
||
QX_REGISTER_HPP_QX_BLOG<span class="operator">(</span>category<span class="operator">,</span> qx<span class="operator">::</span>trait<span class="operator">::</span>no_base_class_defined<span class="operator">,</span><span class="int"> 0</span><span class="operator">)</span><span class="keyword">
|
||
|
||
typedef</span> QSharedPointer<span class="operator"><</span>category<span class="operator">></span> category_ptr<span class="operator">;</span><span class="keyword">
|
||
typedef</span> qx<span class="operator">::</span>QxCollection<span class="operator"><</span><span class="type">long</span><span class="operator">,</span> category_ptr<span class="operator">></span> list_category<span class="operator">;</span><span class="pre">
|
||
|
||
#endif <span class="comment">// _QX_BLOG_CATEGORY_H_</span>
|
||
</span></pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br>
|
||
<table border="1" bgcolor="#FFFFFF">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td title="category.cpp">
|
||
<pre><span class="pre">#include <span class="string">"../include/precompiled.h"</span>
|
||
|
||
#include <span class="string">"../include/category.h"</span>
|
||
#include <span class="string">"../include/blog.h"</span>
|
||
|
||
#include <span class="string"><QxOrm_Impl.h></span>
|
||
</span>
|
||
QX_REGISTER_CPP_QX_BLOG<span class="operator">(</span>category<span class="operator">)</span><span class="keyword">
|
||
|
||
namespace</span> qx<span class="operator"> {</span><span class="keyword">
|
||
template</span><span class="operator"> <></span><span class="type"> void</span> register_class<span class="operator">(</span>QxClass<span class="operator"><</span>category<span class="operator">> &</span> t<span class="operator">)
|
||
{</span>
|
||
t<span class="operator">.</span>id<span class="operator">(&</span> category<span class="operator">::</span>m_id<span class="operator">,</span><span class="string"> "category_id"</span><span class="operator">);</span>
|
||
|
||
t<span class="operator">.</span>data<span class="operator">(&</span> category<span class="operator">::</span>m_name<span class="operator">,</span><span class="string"> "name"</span><span class="operator">);</span>
|
||
t<span class="operator">.</span>data<span class="operator">(&</span> category<span class="operator">::</span>m_desc<span class="operator">,</span><span class="string"> "description"</span><span class="operator">);</span>
|
||
|
||
t<span class="operator">.</span>relationManyToMany<span class="operator">(&</span> category<span class="operator">::</span>m_blogX<span class="operator">,</span><span class="string"> "list_blog"</span><span class="operator">,</span><span class="string"> "category_blog"</span><span class="operator">,</span><span class="string"> "category_id"</span><span class="operator">,</span><span class="string"> "blog_id"</span><span class="operator">);
|
||
}}</span>
|
||
</pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br>
|
||
<br>
|
||
<a name="tuto_9"><u>
|
||
<font color="#100D5A">9- <i>blog.h</i> and <i>blog.cpp</i> (relationship <i>one-to-many</i>,
|
||
<i>many-to-one</i> and <i>many-to-many</i>) :
|
||
</font>
|
||
</u></a><br>
|
||
<br>
|
||
1 <i>blog</i> is written by 1 <i>author</i>, can have many
|
||
<i>comment</i> and can be put inside many <i>category</i>.<br>
|
||
So this class has 3 relationships : <b><i>one-to-many</i>,
|
||
<i>many-to-one</i> and <i>many-to-many</i></b>.<br>
|
||
Like other classes, we define 2 <i>typedef</i> :
|
||
a <i>smart-pointer</i> to a <i>blog</i> object and a list of <i>blog</i>.<br>
|
||
<br>
|
||
<table border="1" bgcolor="#FFFFFF">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td title="blog.h">
|
||
<pre><span class="pre">#ifndef _QX_BLOG_BLOG_H_
|
||
#define _QX_BLOG_BLOG_H_
|
||
|
||
#include <span class="string">"author.h"</span>
|
||
#include <span class="string">"comment.h"</span>
|
||
#include <span class="string">"category.h"</span>
|
||
</span><span class="keyword">
|
||
class</span> QX_BLOG_DLL_EXPORT blog<span class="operator">
|
||
{</span><span class="keyword">
|
||
public</span><span class="operator">:</span><span class="comment">
|
||
// -- properties
|
||
</span><span class="type"> long</span> m_id<span class="operator">;</span>
|
||
QString m_text<span class="operator">;</span>
|
||
QDateTime m_dt_creation<span class="operator">;</span>
|
||
author_ptr m_author<span class="operator">;</span>
|
||
list_comment m_commentX<span class="operator">;</span>
|
||
list_category m_categoryX<span class="operator">;</span><span class="comment">
|
||
// -- contructor, virtual destructor
|
||
</span> blog<span class="operator">() :</span> m_id<span class="operator">(</span><span class="int">0</span><span class="operator">) { ; }</span><span class="keyword">
|
||
virtual</span><span class="operator"> ~</span>blog<span class="operator">() { ; }
|
||
};</span>
|
||
|
||
QX_REGISTER_HPP_QX_BLOG<span class="operator">(</span>blog<span class="operator">,</span> qx<span class="operator">::</span>trait<span class="operator">::</span>no_base_class_defined<span class="operator">,</span><span class="int"> 0</span><span class="operator">)</span><span class="keyword">
|
||
|
||
typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator"><</span>blog<span class="operator">></span> blog_ptr<span class="operator">;</span><span class="keyword">
|
||
typedef</span> std<span class="operator">::</span>vector<span class="operator"><</span>blog_ptr<span class="operator">></span> list_blog<span class="operator">;</span><span class="pre">
|
||
|
||
#endif <span class="comment">// _QX_BLOG_BLOG_H_</span>
|
||
</span></pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br>
|
||
<table border="1" bgcolor="#FFFFFF">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td title="blog.cpp">
|
||
<pre><span class="pre">#include <span class="string">"../include/precompiled.h"</span>
|
||
|
||
#include <span class="string">"../include/blog.h"</span>
|
||
|
||
#include <span class="string"><QxOrm_Impl.h></span>
|
||
</span>
|
||
QX_REGISTER_CPP_QX_BLOG<span class="operator">(</span>blog<span class="operator">)</span><span class="keyword">
|
||
|
||
namespace</span> qx<span class="operator"> {</span><span class="keyword">
|
||
template</span><span class="operator"> <></span><span class="type"> void</span> register_class<span class="operator">(</span>QxClass<span class="operator"><</span>blog<span class="operator">> &</span> t<span class="operator">)
|
||
{</span>
|
||
t<span class="operator">.</span>id<span class="operator">(&</span> blog<span class="operator">::</span>m_id<span class="operator">,</span><span class="string"> "blog_id"</span><span class="operator">);</span>
|
||
|
||
t<span class="operator">.</span>data<span class="operator">(&</span> blog<span class="operator">::</span>m_text<span class="operator">,</span><span class="string"> "blog_text"</span><span class="operator">);</span>
|
||
t<span class="operator">.</span>data<span class="operator">(&</span> blog<span class="operator">::</span>m_dt_creation<span class="operator">,</span><span class="string"> "date_creation"</span><span class="operator">);</span>
|
||
|
||
t<span class="operator">.</span>relationManyToOne<span class="operator">(&</span> blog<span class="operator">::</span>m_author<span class="operator">,</span><span class="string"> "author_id"</span><span class="operator">);</span>
|
||
t<span class="operator">.</span>relationOneToMany<span class="operator">(&</span> blog<span class="operator">::</span>m_commentX<span class="operator">,</span><span class="string"> "list_comment"</span><span class="operator">,</span><span class="string"> "blog_id"</span><span class="operator">);</span>
|
||
t<span class="operator">.</span>relationManyToMany<span class="operator">(&</span> blog<span class="operator">::</span>m_categoryX<span class="operator">,</span><span class="string"> "list_category"</span><span class="operator">,</span><span class="string"> "category_blog"</span><span class="operator">,</span><span class="string"> "blog_id"</span><span class="operator">,</span><span class="string"> "category_id"</span><span class="operator">);
|
||
}}</span>
|
||
</pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br>
|
||
<br>
|
||
<a name="tuto_10"><u>
|
||
<font color="#100D5A">10- <i>main.cpp</i> file :</font>
|
||
</u></a><br>
|
||
<br>
|
||
<b>QxOrm</b> can communicate with many databases (<a href="http://doc.qt.io/qt-5/qtsql-index.html"
|
||
target="_blank">see the list of databases in Qt web site</a>)
|
||
=> <font style="background-color:yellow"><b>persistence</b></font>.<br>
|
||
<b>QxOrm</b> provides also 2 other important functionalities :
|
||
<ul>
|
||
<li><b>
|
||
<font style="background-color:yellow">serialization</font>
|
||
</b> : binary, XML and JSON format
|
||
</li>
|
||
<li><b>
|
||
<font style="background-color:yellow">reflection</font>
|
||
</b> (or <b>
|
||
<font style="background-color:yellow">introspection</font>
|
||
</b>) : access to classes definitions, retrieve properties and call classes methods
|
||
</li>
|
||
</ul>
|
||
<br>
|
||
<table border="1" bgcolor="#FFFFFF">
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td title="main.cpp">
|
||
<pre><span class="pre">#include <span class="string">"../include/precompiled.h"</span>
|
||
|
||
#include <span class="string"><QtGui/qapplication.h></span>
|
||
|
||
#include <span class="string">"../include/blog.h"</span>
|
||
#include <span class="string">"../include/author.h"</span>
|
||
#include <span class="string">"../include/comment.h"</span>
|
||
#include <span class="string">"../include/category.h"</span>
|
||
|
||
#include <span class="string"><QxOrm_Impl.h></span>
|
||
</span><span class="type">
|
||
int</span><span class="keyword"> main</span><span class="operator">(</span><span class="type">int</span> argc<span class="operator">,</span><span class="type"> char</span><span class="operator"> *</span> argv<span class="operator">[])
|
||
{</span><span class="comment">
|
||
// Qt application
|
||
</span> QApplication app<span class="operator">(</span>argc<span class="operator">,</span> argv<span class="operator">);</span><span class="comment">
|
||
|
||
// Parameters to connect to database
|
||
</span> qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-></span>setDriverName<span class="operator">(</span><span class="string">"QSQLITE"</span><span class="operator">);</span>
|
||
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-></span>setDatabaseName<span class="operator">(</span><span class="string">"./qxBlog.sqlite"</span><span class="operator">);</span>
|
||
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-></span>setHostName<span class="operator">(</span><span class="string">"localhost"</span><span class="operator">);</span>
|
||
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-></span>setUserName<span class="operator">(</span><span class="string">"root"</span><span class="operator">);</span>
|
||
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-></span>setPassword<span class="operator">(</span><span class="string">""</span><span class="operator">);</span><span class="comment">
|
||
|
||
// Ensure there is no element in database
|
||
</span> QSqlError daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>delete_all<span class="operator"><</span>author<span class="operator">>();</span>
|
||
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>delete_all<span class="operator"><</span>comment<span class="operator">>();</span>
|
||
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>delete_all<span class="operator"><</span>category<span class="operator">>();</span>
|
||
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>delete_all<span class="operator"><</span>blog<span class="operator">>();</span><span class="comment">
|
||
|
||
// Create a list of 3 author
|
||
</span> author_ptr author_1<span class="operator">;</span> author_1<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> author<span class="operator">());</span>
|
||
author_ptr author_2<span class="operator">;</span> author_2<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> author<span class="operator">());</span>
|
||
author_ptr author_3<span class="operator">;</span> author_3<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> author<span class="operator">());</span>
|
||
|
||
author_1<span class="operator">-></span>m_id<span class="operator"> =</span><span class="string"> "author_id_1"</span><span class="operator">;</span> author_1<span class="operator">-></span>m_name<span class="operator"> =</span><span class="string"> "author_1"</span><span class="operator">;</span>
|
||
author_1<span class="operator">-></span>m_sex<span class="operator"> =</span> author<span class="operator">::</span>male<span class="operator">;</span> author_1<span class="operator">-></span>m_birthdate<span class="operator"> =</span> QDate<span class="operator">::</span>currentDate<span class="operator">();</span>
|
||
author_2<span class="operator">-></span>m_id<span class="operator"> =</span><span class="string"> "author_id_2"</span><span class="operator">;</span> author_2<span class="operator">-></span>m_name<span class="operator"> =</span><span class="string"> "author_2"</span><span class="operator">;</span>
|
||
author_2<span class="operator">-></span>m_sex<span class="operator"> =</span> author<span class="operator">::</span>female<span class="operator">;</span> author_2<span class="operator">-></span>m_birthdate<span class="operator"> =</span> QDate<span class="operator">::</span>currentDate<span class="operator">();</span>
|
||
author_3<span class="operator">-></span>m_id<span class="operator"> =</span><span class="string"> "author_id_3"</span><span class="operator">;</span> author_3<span class="operator">-></span>m_name<span class="operator"> =</span><span class="string"> "author_3"</span><span class="operator">;</span>
|
||
author_3<span class="operator">-></span>m_sex<span class="operator"> =</span> author<span class="operator">::</span>female<span class="operator">;</span> author_3<span class="operator">-></span>m_birthdate<span class="operator"> =</span> QDate<span class="operator">::</span>currentDate<span class="operator">();</span>
|
||
|
||
list_author authorX<span class="operator">;</span>
|
||
authorX<span class="operator">.</span>insert<span class="operator">(</span>author_1<span class="operator">-></span>m_id<span class="operator">,</span> author_1<span class="operator">);</span>
|
||
authorX<span class="operator">.</span>insert<span class="operator">(</span>author_2<span class="operator">-></span>m_id<span class="operator">,</span> author_2<span class="operator">);</span>
|
||
authorX<span class="operator">.</span>insert<span class="operator">(</span>author_3<span class="operator">-></span>m_id<span class="operator">,</span> author_3<span class="operator">);</span><span class="comment">
|
||
|
||
// Insert list of 3 author into database
|
||
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>authorX<span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>qx<span class="operator">::</span>dao<span class="operator">::</span>count<span class="operator"><</span>author<span class="operator">>() ==</span><span class="int"> 3</span><span class="operator">);</span><span class="comment">
|
||
|
||
// Clone author n<>2 : 'author_id_2'
|
||
</span> author_ptr author_clone<span class="operator"> =</span> qx<span class="operator">::</span>clone<span class="operator">(*</span> author_2<span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>author_clone<span class="operator">-></span>m_id<span class="operator"> ==</span><span class="string"> "author_id_2"</span><span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>author_clone<span class="operator">-></span>m_sex<span class="operator"> ==</span> author<span class="operator">::</span>female<span class="operator">);</span><span class="comment">
|
||
|
||
// Create a query to fetch only female author : 'author_id_2' and 'author_id_3'
|
||
</span> qx<span class="operator">::</span>QxSqlQuery query<span class="operator">(</span><span class="string">"WHERE author.sex = :sex"</span><span class="operator">);</span>
|
||
query<span class="operator">.</span>bind<span class="operator">(</span><span class="string">":sex"</span><span class="operator">,</span> author<span class="operator">::</span>female<span class="operator">);</span>
|
||
|
||
list_author list_of_female_author<span class="operator">;</span>
|
||
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>fetch_by_query<span class="operator">(</span>query<span class="operator">,</span> list_of_female_author<span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>list_of_female_author<span class="operator">.</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">);</span><span class="comment">
|
||
|
||
// Dump list of female author (XML or JSON serialization)
|
||
</span> qx<span class="operator">::</span>dump<span class="operator">(</span>list_of_female_author<span class="operator">);</span><span class="comment">
|
||
|
||
// Create 3 categories
|
||
</span> category_ptr category_1<span class="operator"> =</span> category_ptr<span class="operator">(</span><span class="keyword">new</span> category<span class="operator">());</span>
|
||
category_ptr category_2<span class="operator"> =</span> category_ptr<span class="operator">(</span><span class="keyword">new</span> category<span class="operator">());</span>
|
||
category_ptr category_3<span class="operator"> =</span> category_ptr<span class="operator">(</span><span class="keyword">new</span> category<span class="operator">());</span>
|
||
|
||
category_1<span class="operator">-></span>m_name<span class="operator"> =</span><span class="string"> "category_1"</span><span class="operator">;</span> category_1<span class="operator">-></span>m_desc<span class="operator"> =</span><span class="string"> "desc_1"</span><span class="operator">;</span>
|
||
category_2<span class="operator">-></span>m_name<span class="operator"> =</span><span class="string"> "category_2"</span><span class="operator">;</span> category_2<span class="operator">-></span>m_desc<span class="operator"> =</span><span class="string"> "desc_2"</span><span class="operator">;</span>
|
||
category_3<span class="operator">-></span>m_name<span class="operator"> =</span><span class="string"> "category_3"</span><span class="operator">;</span> category_3<span class="operator">-></span>m_desc<span class="operator"> =</span><span class="string"> "desc_3"</span><span class="operator">;
|
||
|
||
{</span><span class="comment"> // Create a scope to destroy temporary connexion to database
|
||
|
||
// Open a transaction to database
|
||
</span> QSqlDatabase db<span class="operator"> =</span> qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getDatabase<span class="operator">();</span><span class="type">
|
||
bool</span> bCommit<span class="operator"> =</span> db<span class="operator">.</span>transaction<span class="operator">();</span><span class="comment">
|
||
|
||
// Insert 3 categories into database, use 'db' parameter for the transaction
|
||
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>category_1<span class="operator">, (&</span> db<span class="operator">));</span> bCommit<span class="operator"> = (</span>bCommit<span class="operator"> && !</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span>
|
||
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>category_2<span class="operator">, (&</span> db<span class="operator">));</span> bCommit<span class="operator"> = (</span>bCommit<span class="operator"> && !</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span>
|
||
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>category_3<span class="operator">, (&</span> db<span class="operator">));</span> bCommit<span class="operator"> = (</span>bCommit<span class="operator"> && !</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span>
|
||
|
||
qAssert<span class="operator">(</span>bCommit<span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>category_1<span class="operator">-></span>m_id<span class="operator"> !=</span><span class="int"> 0</span><span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>category_2<span class="operator">-></span>m_id<span class="operator"> !=</span><span class="int"> 0</span><span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>category_3<span class="operator">-></span>m_id<span class="operator"> !=</span><span class="int"> 0</span><span class="operator">);</span><span class="comment">
|
||
|
||
// Terminate transaction => commit or rollback if there is error
|
||
</span><span class="flow"> if</span><span class="operator"> (</span>bCommit<span class="operator">) {</span> db<span class="operator">.</span>commit<span class="operator">(); }</span><span class="flow">
|
||
else</span><span class="operator"> {</span> db<span class="operator">.</span>rollback<span class="operator">(); }
|
||
|
||
}</span><span class="comment"> // End of scope : 'db' is destroyed
|
||
|
||
// Create a blog with the class name (factory)
|
||
</span> boost<span class="operator">::</span>any blog_any<span class="operator"> =</span> qx<span class="operator">::</span>create<span class="operator">(</span><span class="string">"blog"</span><span class="operator">);</span>
|
||
blog_ptr blog_1<span class="operator"> =</span> boost<span class="operator">::</span>any_cast<span class="operator"><</span>blog_ptr<span class="operator">>(</span>blog_any<span class="operator">);</span>
|
||
blog_1<span class="operator">-></span>m_text<span class="operator"> =</span><span class="string"> "blog_text_1"</span><span class="operator">;</span>
|
||
blog_1<span class="operator">-></span>m_dt_creation<span class="operator"> =</span> QDateTime<span class="operator">::</span>currentDateTime<span class="operator">();</span>
|
||
blog_1<span class="operator">-></span>m_author<span class="operator"> =</span> author_1<span class="operator">;</span><span class="comment">
|
||
|
||
// Insert 'blog_1' into database with 'save()' method
|
||
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save<span class="operator">(</span>blog_1<span class="operator">);</span><span class="comment">
|
||
|
||
// Modify 'blog_1' properties and save into database
|
||
</span> blog_1<span class="operator">-></span>m_text<span class="operator"> =</span><span class="string"> "update blog_text_1"</span><span class="operator">;</span>
|
||
blog_1<span class="operator">-></span>m_author<span class="operator"> =</span> author_2<span class="operator">;</span>
|
||
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save<span class="operator">(</span>blog_1<span class="operator">);</span><span class="comment">
|
||
|
||
// Add 2 comments to 'blog_1'
|
||
</span> comment_ptr comment_1<span class="operator">;</span> comment_1<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> comment<span class="operator">());</span>
|
||
comment_ptr comment_2<span class="operator">;</span> comment_2<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> comment<span class="operator">());</span>
|
||
|
||
comment_1<span class="operator">-></span>m_text<span class="operator"> =</span><span class="string"> "comment_1 text"</span><span class="operator">;</span>
|
||
comment_1<span class="operator">-></span>m_dt_create<span class="operator"> =</span> QDateTime<span class="operator">::</span>currentDateTime<span class="operator">();</span>
|
||
comment_1<span class="operator">-></span>m_blog<span class="operator"> =</span> blog_1<span class="operator">;</span>
|
||
comment_2<span class="operator">-></span>m_text<span class="operator"> =</span><span class="string"> "comment_2 text"</span><span class="operator">;</span>
|
||
comment_2<span class="operator">-></span>m_dt_create<span class="operator"> =</span> QDateTime<span class="operator">::</span>currentDateTime<span class="operator">();</span>
|
||
comment_2<span class="operator">-></span>m_blog<span class="operator"> =</span> blog_1<span class="operator">;</span>
|
||
|
||
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>comment_1<span class="operator">);</span>
|
||
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>comment_2<span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>qx<span class="operator">::</span>dao<span class="operator">::</span>count<span class="operator"><</span>comment<span class="operator">>() ==</span><span class="int"> 2</span><span class="operator">);</span><span class="comment">
|
||
|
||
// Add 2 categories to 'blog_1' => must insert into extra-table 'category_blog'
|
||
</span> blog_1<span class="operator">-></span>m_categoryX<span class="operator">.</span>insert<span class="operator">(</span>category_1<span class="operator">-></span>m_id<span class="operator">,</span> category_1<span class="operator">);</span>
|
||
blog_1<span class="operator">-></span>m_categoryX<span class="operator">.</span>insert<span class="operator">(</span>category_3<span class="operator">-></span>m_id<span class="operator">,</span> category_3<span class="operator">);</span>
|
||
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save_with_relation<span class="operator">(</span><span class="string">"list_category"</span><span class="operator">,</span> blog_1<span class="operator">);</span><span class="comment">
|
||
|
||
// Fetch blog into a new variable with all relation : 'author', 'comment' and 'category'
|
||
</span> blog_ptr blog_tmp<span class="operator">;</span> blog_tmp<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> blog<span class="operator">());</span>
|
||
blog_tmp<span class="operator">-></span>m_id<span class="operator"> =</span> blog_1<span class="operator">-></span>m_id<span class="operator">;</span>
|
||
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>fetch_by_id_with_all_relation<span class="operator">(</span>blog_tmp<span class="operator">);</span>
|
||
|
||
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-></span>m_commentX<span class="operator">.</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-></span>m_categoryX<span class="operator">.</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-></span>m_text<span class="operator"> ==</span><span class="string"> "update blog_text_1"</span><span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-></span>m_author<span class="operator"> &&</span> blog_tmp<span class="operator">-></span>m_author<span class="operator">-></span>m_id<span class="operator"> ==</span><span class="string"> "author_id_2"</span><span class="operator">);</span><span class="comment">
|
||
|
||
// Dump 'blog_tmp' result from database (XML or JSON serialization)
|
||
</span> qx<span class="operator">::</span>dump<span class="operator">(</span>blog_tmp<span class="operator">);</span><span class="comment">
|
||
|
||
// Call 'age()' method with class name and method name (reflection)
|
||
</span> qx_bool bInvokeOk<span class="operator"> =</span> qx<span class="operator">::</span>QxClassX<span class="operator">::</span>invoke<span class="operator">(</span><span class="string">"author"</span><span class="operator">,</span><span class="string"> "age"</span><span class="operator">,</span> author_1<span class="operator">);</span>
|
||
qAssert<span class="operator">(</span>bInvokeOk<span class="operator">);</span><span class="flow">
|
||
|
||
return</span><span class="int"> 0</span><span class="operator">;
|
||
}</span>
|
||
</pre>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br><br>
|
||
<a href="./resource/qxBlog.main.exec.result.txt"><i>Click here to see output debug trace after execution
|
||
of <b>qxBlog</b> program...</i></a>
|
||
<br><br>
|
||
<div style="width:900px; height:500px; overflow:auto; background-color:white">
|
||
<pre>
|
||
[QxOrm] qx::QxSqlDatabase : create new database connection in thread '4456' with key '{e986c95d-1cb0-4368-ad9c-3dd4ccd20b84}'
|
||
[QxOrm] sql query (93 ms) : DELETE FROM author
|
||
[QxOrm] sql query (63 ms) : DELETE FROM comment
|
||
[QxOrm] sql query (94 ms) : DELETE FROM category
|
||
[QxOrm] sql query (78 ms) : DELETE FROM blog
|
||
[QxOrm] sql query (62 ms) : INSERT INTO author (author_id, name, birthdate, sex) VALUES (:author_id, :name, :birthdate, :sex)
|
||
[QxOrm] sql query (0 ms) : SELECT COUNT(*) FROM author
|
||
[QxOrm] sql query (0 ms) : SELECT author.author_id AS author_author_id_0, author.name AS author_name_0, author.birthdate AS author_birthdate_0, author.sex AS author_sex_0 FROM author WHERE author.sex = :sex
|
||
[QxOrm] start dump 'qx::QxCollection<QString, boost::shared_ptr<author>>'
|
||
<qx.QxCollection-QString_boost.shared_ptr-author-- class_id="0" tracking_level="0" version="0">
|
||
<count>2</count>
|
||
<item class_id="1" tracking_level="0" version="0">
|
||
<first class_id="2" tracking_level="0" version="0">author_id_2</first>
|
||
<second class_id="3" tracking_level="0" version="1">
|
||
<px class_id="4" tracking_level="1" version="0" object_id="_0">
|
||
<author_id>author_id_2</author_id>
|
||
<name>author_2</name>
|
||
<birthdate class_id="5" tracking_level="0" version="0">20100409</birthdate>
|
||
<sex>1</sex>
|
||
<list_blog class_id="6" tracking_level="0" version="0">
|
||
<count>0</count>
|
||
<item_version>1</item_version>
|
||
</list_blog>
|
||
</px>
|
||
</second>
|
||
</item>
|
||
<item>
|
||
<first>author_id_3</first>
|
||
<second>
|
||
<px class_id_reference="4" object_id="_1">
|
||
<author_id>author_id_3</author_id>
|
||
<name>author_3</name>
|
||
<birthdate>20100409</birthdate>
|
||
<sex>1</sex>
|
||
<list_blog>
|
||
<count>0</count>
|
||
<item_version>1</item_version>
|
||
</list_blog>
|
||
</px>
|
||
</second>
|
||
</item>
|
||
</qx.QxCollection-QString_boost.shared_ptr-author-->
|
||
[QxOrm] end dump 'qx::QxCollection<QString, boost::shared_ptr<author>>'
|
||
[QxOrm] sql query (0 ms) : INSERT INTO category (name, description) VALUES (:name, :description)
|
||
[QxOrm] sql query (0 ms) : INSERT INTO category (name, description) VALUES (:name, :description)
|
||
[QxOrm] sql query (0 ms) : INSERT INTO category (name, description) VALUES (:name, :description)
|
||
[QxOrm] sql query (0 ms) : INSERT INTO blog (blog_text, date_creation, author_id) VALUES (:blog_text, :date_creation, :author_id)
|
||
[QxOrm] sql query (0 ms) : SELECT blog.blog_id AS blog_blog_id_0 FROM blog WHERE blog_blog_id_0 = :blog_id
|
||
[QxOrm] sql query (0 ms) : UPDATE blog SET blog_id = :blog_id, blog_text = :blog_text, date_creation = :date_creation, author_id = :author_id WHERE blog_id = :blog_id_bis
|
||
[QxOrm] sql query (78 ms) : INSERT INTO comment (comment_text, date_creation, blog_id) VALUES (:comment_text, :date_creation, :blog_id)
|
||
[QxOrm] sql query (78 ms) : INSERT INTO comment (comment_text, date_creation, blog_id) VALUES (:comment_text, :date_creation, :blog_id)
|
||
[QxOrm] sql query (0 ms) : SELECT COUNT(*) FROM comment
|
||
[QxOrm] sql query (0 ms) : SELECT blog.blog_id AS blog_blog_id_0 FROM blog WHERE blog_blog_id_0 = :blog_id
|
||
[QxOrm] sql query (0 ms) : UPDATE blog SET blog_id = :blog_id, blog_text = :blog_text, date_creation = :date_creation, author_id = :author_id WHERE blog_id = :blog_id_bis
|
||
[QxOrm] sql query (0 ms) : SELECT category.category_id AS category_category_id_0 FROM category WHERE category_category_id_0 = :category_id
|
||
[QxOrm] sql query (0 ms) : UPDATE category SET category_id = :category_id, name = :name, description = :description WHERE category_id = :category_id_bis
|
||
[QxOrm] sql query (0 ms) : SELECT category.category_id AS category_category_id_0 FROM category WHERE category_category_id_0 = :category_id
|
||
[QxOrm] sql query (0 ms) : UPDATE category SET category_id = :category_id, name = :name, description = :description WHERE category_id = :category_id_bis
|
||
[QxOrm] sql query (extra-table) : DELETE FROM category_blog WHERE category_blog.blog_id = :blog_id
|
||
[QxOrm] sql query (extra-table) : INSERT INTO category_blog (blog_id, category_id) VALUES (:blog_id, :category_id)
|
||
[QxOrm] sql query (0 ms) : SELECT blog.blog_id AS blog_blog_id_0, blog.blog_text AS blog_blog_text_0, blog.date_creation AS blog_date_creation_0, blog.author_id AS blog_author_id_0, author_1.author_id AS author_1_author_id_0, author_1.name AS author_1_name_0, author_1.birthdate AS author_1_birthdate_0, author_1.sex AS author_1_sex_0, comment_2.comment_id AS comment_2_comment_id_0, comment_2.blog_id AS comment_2_blog_id_0, comment_2.comment_text AS comment_2_comment_text_0, comment_2.date_creation AS comment_2_date_creation_0, category_3.category_id AS category_3_category_id_0, category_3.name AS category_3_name_0, category_3.description AS category_3_description_0 FROM blog LEFT OUTER JOIN author author_1 ON author_1_author_id_0 = blog_author_id_0 LEFT OUTER JOIN comment comment_2 ON comment_2_blog_id_0 = blog_blog_id_0 LEFT OUTER JOIN category_blog ON blog_blog_id_0 = category_blog.blog_id LEFT OUTER JOIN category category_3 ON category_blog.category_id = category_3_category_id_0 WHERE blog_blog_id_0 = :blog_id
|
||
[QxOrm] start dump 'boost::shared_ptr<blog>'
|
||
<boost.shared_ptr-blog- class_id="0" tracking_level="0" version="1">
|
||
<px class_id="1" tracking_level="1" version="0" object_id="_0">
|
||
<blog_id>113</blog_id>
|
||
<blog_text class_id="2" tracking_level="0" version="0">update blog_text_1</blog_text>
|
||
<date_creation class_id="3" tracking_level="0" version="0">20100409162612000</date_creation>
|
||
<author_id class_id="4" tracking_level="0" version="1">
|
||
<px class_id="5" tracking_level="1" version="0" object_id="_1">
|
||
<author_id>author_id_2</author_id>
|
||
<name>author_2</name>
|
||
<birthdate class_id="6" tracking_level="0" version="0">20100409</birthdate>
|
||
<sex>1</sex>
|
||
<list_blog class_id="7" tracking_level="0" version="0">
|
||
<count>0</count>
|
||
<item_version>1</item_version>
|
||
</list_blog>
|
||
</px>
|
||
</author_id>
|
||
<list_comment class_id="8" tracking_level="0" version="0">
|
||
<count>2</count>
|
||
<item class_id="9" tracking_level="0" version="1">
|
||
<px class_id="10" tracking_level="1" version="0" object_id="_2">
|
||
<comment_id>209</comment_id>
|
||
<comment_text>comment_1 text</comment_text>
|
||
<date_creation>20100409162612000</date_creation>
|
||
<blog_id>
|
||
<px class_id_reference="1" object_id="_3">
|
||
<blog_id>113</blog_id>
|
||
<blog_text></blog_text>
|
||
<date_creation></date_creation>
|
||
<author_id>
|
||
<px class_id="-1"></px>
|
||
</author_id>
|
||
<list_comment>
|
||
<count>0</count>
|
||
</list_comment>
|
||
<list_category class_id="11" tracking_level="0" version="0">
|
||
<count>0</count>
|
||
</list_category>
|
||
</px>
|
||
</blog_id>
|
||
</px>
|
||
</item>
|
||
<item>
|
||
<px class_id_reference="10" object_id="_4">
|
||
<comment_id>210</comment_id>
|
||
<comment_text>comment_2 text</comment_text>
|
||
<date_creation>20100409162612000</date_creation>
|
||
<blog_id>
|
||
<px class_id_reference="1" object_id="_5">
|
||
<blog_id>113</blog_id>
|
||
<blog_text></blog_text>
|
||
<date_creation></date_creation>
|
||
<author_id>
|
||
<px class_id="-1"></px>
|
||
</author_id>
|
||
<list_comment>
|
||
<count>0</count>
|
||
</list_comment>
|
||
<list_category>
|
||
<count>0</count>
|
||
</list_category>
|
||
</px>
|
||
</blog_id>
|
||
</px>
|
||
</item>
|
||
</list_comment>
|
||
<list_category>
|
||
<count>2</count>
|
||
<item class_id="12" tracking_level="0" version="0">
|
||
<first>355</first>
|
||
<second class_id="13" tracking_level="0" version="0">
|
||
<qt_shared_ptr class_id="14" tracking_level="1" version="0" object_id="_6">
|
||
<category_id>355</category_id>
|
||
<name>category_1</name>
|
||
<description>desc_1</description>
|
||
<list_blog class_id="15" tracking_level="0" version="0">
|
||
<count>0</count>
|
||
</list_blog>
|
||
</qt_shared_ptr>
|
||
</second>
|
||
</item>
|
||
<item>
|
||
<first>357</first>
|
||
<second>
|
||
<qt_shared_ptr class_id_reference="14" object_id="_7">
|
||
<category_id>357</category_id>
|
||
<name>category_3</name>
|
||
<description>desc_3</description>
|
||
<list_blog>
|
||
<count>0</count>
|
||
</list_blog>
|
||
</qt_shared_ptr>
|
||
</second>
|
||
</item>
|
||
</list_category>
|
||
</px>
|
||
</boost.shared_ptr-blog->
|
||
[QxOrm] end dump 'boost::shared_ptr<blog>'
|
||
</pre>
|
||
</div>
|
||
<br><br>
|
||
<i>Important note</i> : <b>QxOrm</b> doesn't want to hide sql query (by default, all sql queries are
|
||
displayed).<br>
|
||
<b>QxOrm</b> cannot resolve all problems with sql and databases,
|
||
so it is sometimes necessary to use <a href="http://doc.qt.io/qt-5/qtsql-index.html"
|
||
target="_blank"><i>QtSql</i></a> engine of Qt library
|
||
to write your own sql query or stored procedure.<br>
|
||
<br><br>
|
||
<a name="tuto_11"><u>
|
||
<font color="#100D5A">11- relationship <i>one-to-one</i> with <i>person</i> class :</font>
|
||
</u></a><br>
|
||
<br>
|
||
<b>QxOrm</b> can also be used with relationship <i>one-to-one</i>.<br>
|
||
We add to our project the class <i>person</i> (<i>person.h</i> and
|
||
<i>person.cpp</i> files) : 1 <i>person</i> is 1 <i>author</i>.<br>
|
||
So <i>person</i> and <i>author</i> share the same id in the database : this is a relationship
|
||
<b><i>one-to-one</i></b>. <br>
|
||
There is 2 tables in the database : <br><br>
|
||
<img alt="qxBlog.table.person" src="resource/qxBlog.table.person.jpg" width="279" height="118"><br>
|
||
<br>
|
||
<i>Note</i> : we add to <i>person</i> table the column <i>mother_id</i>. So we
|
||
can retrieve the mother (of type <i>person</i>) belongs to 1 <i>person</i> :
|
||
this is a relationship <i>many-to-one</i> on the same table <i>person</i>.
|
||
Moreover, if 1 <i>person</i> is a mother, we can retrieve the list of childs (of type <i>person</i>) :
|
||
this is a relationship <i>one-to-many</i> on the same table <i>person</i>. </p>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<br>
|
||
<hr style="width: 80%" align="center" size="1" color="#100D5A">
|
||
<table border="0" style="width: 80%" align="center">
|
||
<col>
|
||
<col>
|
||
<col>
|
||
<tbody>
|
||
<tr>
|
||
<td align="left" valign="middle">
|
||
<img alt="QxOrm" src="./resource/logo_qxorm_small.png" width="168" height="40">
|
||
</td>
|
||
<td align="center" valign="middle">
|
||
<font size="2"><EFBFBD> 2011-202XDL Teamty - <a href="mailto:ic-east.com">ic-east.com</a></font>
|
||
</td>
|
||
<td align="right" valign="middle">
|
||
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
|
||
<input type="hidden" name="cmd" value="_s-xclick">
|
||
<input type="hidden" name="hosted_button_id" value="2K4Z58ZYAYJ6S">
|
||
<input type="image" src="./resource/paypal_support_qxorm_library.gif" border="0" name="submit"
|
||
alt="Support QxOrm library - PayPal">
|
||
<img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
|
||
</form>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</body>
|
||
|
||
</html> |