]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - data/Relationships/One2MRelationship.php
Release 6.3.0
[Github/sugarcrm.git] / data / Relationships / One2MRelationship.php
1 <?php
2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4  * SugarCRM Community Edition is a customer relationship management program developed by
5  * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
6  * 
7  * This program is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU Affero General Public License version 3 as published by the
9  * Free Software Foundation with the addition of the following permission added
10  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
11  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
12  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
13  * 
14  * This program is distributed in the hope that it will be useful, but WITHOUT
15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
17  * details.
18  * 
19  * You should have received a copy of the GNU Affero General Public License along with
20  * this program; if not, see http://www.gnu.org/licenses or write to the Free
21  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22  * 02110-1301 USA.
23  * 
24  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
25  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
26  * 
27  * The interactive user interfaces in modified source and object code versions
28  * of this program must display Appropriate Legal Notices, as required under
29  * Section 5 of the GNU Affero General Public License version 3.
30  * 
31  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
32  * these Appropriate Legal Notices must retain the display of the "Powered by
33  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
34  * technical reasons, the Appropriate Legal Notices must display the words
35  * "Powered by SugarCRM".
36  ********************************************************************************/
37
38
39 require_once("data/Relationships/M2MRelationship.php");
40
41 /**
42  * Represents a one to many relationship that is table based.
43  */
44 class One2MRelationship extends M2MRelationship
45 {
46
47     public function __construct($def)
48     {
49         global $dictionary;
50
51         $this->def = $def;
52         $this->name = $def['name'];
53
54         $this->selfReferencing = $def['lhs_module'] == $def['rhs_module'];
55         $lhsModule = $def['lhs_module'];
56         $rhsModule = $def['rhs_module'];
57
58         if ($this->selfReferencing)
59         {
60             $links = VardefManager::getLinkFieldForRelationship(
61                 $lhsModule, BeanFactory::getObjectName($lhsModule), $this->name
62             );
63             if (empty($links))
64             {
65                 $GLOBALS['log']->fatal("No Links found for relationship {$this->name}");
66             }
67             else {
68                 if (!is_array($links)) //Only one link for a self referencing relationship, this is BAAAD
69                 {
70                     $this->lhsLinkDef = $this->rhsLinkDef = $links;
71                 }
72                 else if (!empty($links[0]) && !empty($links[1]))
73                 {
74
75                     if ((!empty($links[0]['side']) && $links[0]['side'] == "right")
76                         || (!empty($links[0]['link_type']) && $links[0]['link_type'] == "one"))
77                     {
78                         //$links[0] is the RHS
79                         $this->lhsLinkDef = $links[1];
80                         $this->rhsLinkDef = $links[0];
81                     } else
82                     {
83                         //$links[0] is the LHS
84                         $this->lhsLinkDef = $links[0];
85                         $this->rhsLinkDef = $links[1];
86                     }
87                 }
88             }
89         } else
90         {
91             $this->lhsLinkDef = VardefManager::getLinkFieldForRelationship(
92                 $lhsModule, BeanFactory::getObjectName($lhsModule), $this->name
93             );
94             $this->rhsLinkDef = VardefManager::getLinkFieldForRelationship(
95                 $rhsModule, BeanFactory::getObjectName($rhsModule), $this->name
96             );
97             if (!isset($this->lhsLinkDef['name']) && isset($this->lhsLinkDef[0]))
98             {
99               $this->lhsLinkDef = $this->lhsLinkDef[0];
100             }
101             if (!isset($this->rhsLinkDef['name']) && isset($this->rhsLinkDef[0])) {
102                 $this->rhsLinkDef = $this->rhsLinkDef[0];
103             }
104         }
105         $this->lhsLink = $this->lhsLinkDef['name'];
106         $this->rhsLink = $this->rhsLinkDef['name'];
107     }
108
109     public function getQuery($link, $params = array())
110     {
111         //Self referenceing one to many relationships use one link for subpanels and normal views.
112         //This mean we have to reverse it for normal views
113         if (($link->getSide() == REL_LHS && !$this->selfReferencing)
114             || $link->getSide() == REL_RHS && $this->selfReferencing
115         ) {
116             $knownKey = $this->def['join_key_lhs'];
117             $targetKey = $this->def['join_key_rhs'];
118         }
119         else
120         {
121             $knownKey = $this->def['join_key_rhs'];
122             $targetKey = $this->def['join_key_lhs'];
123         }
124         $rel_table = $this->getRelationshipTable();
125
126         $where = "$rel_table.$knownKey = '{$link->getFocus()->id}'" . $this->getRoleWhere();
127
128         if (empty($params['return_as_array'])) {
129             return "SELECT $targetKey id FROM $rel_table WHERE $where AND deleted=0";
130         }
131         else
132         {
133             return array(
134                 'select' => "SELECT $targetKey id",
135                 'from' => "FROM $rel_table",
136                 'where' => "WHERE $where AND $rel_table.deleted=0",
137             );
138         }
139     }
140
141     /**
142      * @param  $lhs SugarBean left side bean to add to the relationship.
143      * @param  $rhs SugarBean right side bean to add to the relationship.
144      * @param  $additionalFields key=>value pairs of fields to save on the relationship
145      * @return boolean true if successful
146      */
147     public function add($lhs, $rhs, $additionalFields = array())
148     {
149         $dataToInsert = $this->getRowToInsert($lhs, $rhs, $additionalFields);
150         //If the current data matches the existing data, don't do anything
151         if (!$this->checkExisting($dataToInsert))
152         {
153             $rhsLinkName = $this->rhsLink;
154             //In a one to many, any existing links from the many (right) side must be removed first
155             $rhs->load_relationship($rhsLinkName);
156             $this->removeAll($rhs->$rhsLinkName);
157             parent::add($lhs, $rhs, $additionalFields);
158         }
159     }
160
161     /**
162      * Just overriding the function from M2M to prevent it from occuring
163      */
164     protected function addSelfReferencing($lhs, $rhs, $additionalFields = array())
165     {
166         //No opp on One2M.
167     }
168
169     /**
170      * Just overriding the function from M2M to prevent it from occuring
171      */
172     protected function removeSelfReferencing($lhs, $rhs, $additionalFields = array())
173     {
174         //No opp on One2M.
175     }
176 }