Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
doctrine-dbal
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Tomáš Trávníček
doctrine-dbal
Commits
4a379951
Commit
4a379951
authored
May 21, 2007
by
zYne
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
--no commit message
--no commit message
parent
2e6d8a98
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
416 additions
and
0 deletions
+416
-0
ParserOld.php
lib/Doctrine/Relation/ParserOld.php
+416
-0
No files found.
lib/Doctrine/Relation/ParserOld.php
0 → 100644
View file @
4a379951
<?php
/*
* $Id: Table.php 1397 2007-05-19 19:54:15Z zYne $
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
/**
* Doctrine_Relation_ParserOld
*
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @version $Revision: 1397 $
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
*/
class
Doctrine_Relation_ParserOld
{
/**
* @var Doctrine_Table $_table the table object this parser belongs to
*/
protected
$_table
;
/**
* @var array $relations an array containing all the Doctrine_Relation objects for this table
*/
private
$relations
=
array
();
/**
* @var array $bound bound relations
*/
private
$bound
=
array
();
/**
* @var array $boundAliases bound relation aliases
*/
private
$boundAliases
=
array
();
/**
* constructor
*
* @param Doctrine_Table $table the table object this parser belongs to
*/
public
function
__construct
(
Doctrine_Table
$table
)
{
$this
->
_table
=
$table
;
}
/**
* getTable
*
* @return Doctrine_Table the table object this parser belongs to
*/
public
function
getTable
()
{
return
$this
->
_table
;
}
/**
* returns all bound relations
*
* @return array
*/
public
function
getBounds
()
{
return
$this
->
bound
;
}
/**
* returns a bound relation array
*
* @param string $name
* @return array
*/
public
function
getBound
(
$name
)
{
if
(
!
isset
(
$this
->
bound
[
$name
]))
{
throw
new
Doctrine_Relation_Exception
(
'Unknown bound '
.
$name
);
}
return
$this
->
bound
[
$name
];
}
/**
* returns a bound relation array
*
* @param string $name
* @return array
*/
public
function
getBoundForName
(
$name
,
$component
)
{
foreach
(
$this
->
bound
as
$k
=>
$bound
)
{
$e
=
explode
(
'.'
,
$bound
[
'field'
]);
if
(
$bound
[
'class'
]
==
$name
&&
$e
[
0
]
==
$component
)
{
return
$this
->
bound
[
$k
];
}
}
throw
new
Doctrine_Relation_Exception
(
'Unknown bound '
.
$name
);
}
/**
* returns the alias for given component name
*
* @param string $name
* @return string
*/
public
function
getAlias
(
$name
)
{
if
(
isset
(
$this
->
boundAliases
[
$name
]))
{
return
$this
->
boundAliases
[
$name
];
}
return
$name
;
}
/**
* returns component name for given alias
*
* @param string $alias
* @return string
*/
public
function
getAliasName
(
$alias
)
{
if
(
$name
=
array_search
(
$alias
,
$this
->
boundAliases
))
{
return
$name
;
}
return
$alias
;
}
/**
* unbinds all relations
*
* @return void
*/
public
function
unbindAll
()
{
$this
->
bound
=
array
();
$this
->
relations
=
array
();
$this
->
boundAliases
=
array
();
}
/**
* unbinds a relation
* returns true on success, false on failure
*
* @param $name
* @return boolean
*/
public
function
unbind
(
$name
)
{
if
(
!
isset
(
$this
->
bound
[
$name
]))
{
return
false
;
}
unset
(
$this
->
bound
[
$name
]);
if
(
isset
(
$this
->
relations
[
$name
]))
{
unset
(
$this
->
relations
[
$name
]);
}
if
(
isset
(
$this
->
boundAliases
[
$name
]))
{
unset
(
$this
->
boundAliases
[
$name
]);
}
return
true
;
}
/**
* binds a relation
*
* @param string $name
* @param string $field
* @return void
*/
public
function
bind
(
$name
,
$field
,
$type
,
$options
=
null
)
{
if
(
isset
(
$this
->
relations
[
$name
]))
{
unset
(
$this
->
relations
[
$name
]);
}
$lower
=
strtolower
(
$name
);
if
(
isset
(
$this
->
columns
[
$lower
]))
{
throw
new
Doctrine_Table_Exception
(
"Couldn't bind relation. Column with name "
.
$lower
.
' already exists!'
);
}
$e
=
explode
(
' as '
,
$name
);
$name
=
$e
[
0
];
if
(
isset
(
$e
[
1
]))
{
$alias
=
$e
[
1
];
$this
->
boundAliases
[
$name
]
=
$alias
;
}
else
{
$alias
=
$name
;
}
$this
->
bound
[
$alias
]
=
array
(
'field'
=>
$field
,
'type'
=>
$type
,
'class'
=>
$name
,
'alias'
=>
$alias
);
if
(
$options
!==
null
)
{
$opt
=
array
();
if
(
is_string
(
$options
))
{
$opt
[
'local'
]
=
$options
;
}
else
{
$opt
=
(
array
)
$options
;
}
$this
->
bound
[
$alias
]
=
array_merge
(
$this
->
bound
[
$alias
],
$opt
);
}
}
/**
* hasRelatedComponent
* @return boolean
*/
public
function
hasRelatedComponent
(
$name
,
$component
)
{
return
(
strpos
(
$this
->
bound
[
$name
][
'field'
],
$component
.
'.'
)
!==
false
);
}
/**
* @param string $name component name of which a foreign key object is bound
* @return boolean
*/
final
public
function
hasRelation
(
$name
)
{
if
(
isset
(
$this
->
bound
[
$name
]))
{
return
true
;
}
foreach
(
$this
->
bound
as
$k
=>
$v
)
{
if
(
$this
->
hasRelatedComponent
(
$k
,
$name
))
{
return
true
;
}
}
return
false
;
}
/**
* getRelation
*
* @param string $name component name of which a foreign key object is bound
* @return Doctrine_Relation
*/
public
function
getRelation
(
$name
,
$recursive
=
true
)
{
if
(
isset
(
$this
->
relations
[
$name
]))
{
return
$this
->
relations
[
$name
];
}
if
(
!
$this
->
conn
->
hasTable
(
$this
->
options
[
'name'
]))
{
$allowExport
=
true
;
}
else
{
$allowExport
=
false
;
}
if
(
isset
(
$this
->
bound
[
$name
]))
{
$definition
=
$this
->
bound
[
$name
];
list
(
$component
,
$tmp
)
=
explode
(
'.'
,
$definition
[
'field'
]);
if
(
!
isset
(
$definition
[
'foreign'
]))
{
$definition
[
'foreign'
]
=
$tmp
;
}
unset
(
$definition
[
'field'
]);
$definition
[
'table'
]
=
$this
->
conn
->
getTable
(
$definition
[
'class'
],
$allowExport
);
$definition
[
'constraint'
]
=
false
;
if
(
$component
==
$this
->
options
[
'name'
]
||
in_array
(
$component
,
$this
->
options
[
'parents'
]))
{
// ONE-TO-ONE
if
(
$definition
[
'type'
]
==
Doctrine_Relation
::
ONE_COMPOSITE
||
$definition
[
'type'
]
==
Doctrine_Relation
::
ONE_AGGREGATE
)
{
// tree structure parent relation found
if
(
!
isset
(
$definition
[
'local'
]))
{
$definition
[
'local'
]
=
$definition
[
'foreign'
];
$definition
[
'foreign'
]
=
$definition
[
'table'
]
->
getIdentifier
();
}
$relation
=
new
Doctrine_Relation_LocalKey
(
$definition
);
}
else
{
// tree structure children relation found
if
(
!
isset
(
$definition
[
'local'
]))
{
$tmp
=
$definition
[
'table'
]
->
getIdentifier
();
$definition
[
'local'
]
=
$tmp
;
}
//$definition['foreign'] = $tmp;
$definition
[
'constraint'
]
=
true
;
$relation
=
new
Doctrine_Relation_ForeignKey
(
$definition
);
}
}
elseif
(
$component
==
$definition
[
'class'
]
||
(
$component
==
$definition
[
'alias'
]))
{
// && ($name == $this->options['name'] || in_array($name,$this->parents))
if
(
!
isset
(
$defintion
[
'local'
]))
{
$definition
[
'local'
]
=
$this
->
identifier
;
}
$definition
[
'constraint'
]
=
true
;
// ONE-TO-MANY or ONE-TO-ONE
$relation
=
new
Doctrine_Relation_ForeignKey
(
$definition
);
}
else
{
// MANY-TO-MANY
// only aggregate relations allowed
if
(
$definition
[
'type'
]
!=
Doctrine_Relation
::
MANY_AGGREGATE
)
{
throw
new
Doctrine_Table_Exception
(
"Only aggregate relations are allowed for many-to-many relations"
);
}
$classes
=
array_merge
(
$this
->
options
[
'parents'
],
array
(
$this
->
options
[
'name'
]));
foreach
(
array_reverse
(
$classes
)
as
$class
)
{
try
{
$bound
=
$definition
[
'table'
]
->
getBoundForName
(
$class
,
$component
);
break
;
}
catch
(
Doctrine_Table_Exception
$exc
)
{
}
}
if
(
!
isset
(
$bound
))
{
throw
new
Doctrine_Table_Exception
(
"Couldn't map many-to-many relation for "
.
$this
->
options
[
'name'
]
.
" and
$name
. Components use different join tables."
);
}
if
(
!
isset
(
$definition
[
'local'
]))
{
$definition
[
'local'
]
=
$this
->
identifier
;
}
$e2
=
explode
(
'.'
,
$bound
[
'field'
]);
$fields
=
explode
(
'-'
,
$e2
[
1
]);
if
(
$e2
[
0
]
!=
$component
)
{
throw
new
Doctrine_Table_Exception
(
$e2
[
0
]
.
' doesn\'t match '
.
$component
);
}
$associationTable
=
$this
->
conn
->
getTable
(
$e2
[
0
],
$allowExport
);
if
(
count
(
$fields
)
>
1
)
{
// SELF-REFERENCING THROUGH JOIN TABLE
$def
[
'table'
]
=
$associationTable
;
$def
[
'local'
]
=
$this
->
identifier
;
$def
[
'foreign'
]
=
$fields
[
0
];
$def
[
'alias'
]
=
$e2
[
0
];
$def
[
'class'
]
=
$e2
[
0
];
$def
[
'type'
]
=
Doctrine_Relation
::
MANY_COMPOSITE
;
$this
->
relations
[
$e2
[
0
]]
=
new
Doctrine_Relation_ForeignKey
(
$def
);
$definition
[
'assocTable'
]
=
$associationTable
;
$definition
[
'local'
]
=
$fields
[
0
];
$definition
[
'foreign'
]
=
$fields
[
1
];
$relation
=
new
Doctrine_Relation_Association_Self
(
$definition
);
}
else
{
if
(
$definition
[
'table'
]
===
$this
)
{
}
else
{
// auto initialize a new one-to-one relationships for association table
$associationTable
->
bind
(
$this
->
getComponentName
(),
$associationTable
->
getComponentName
()
.
'.'
.
$e2
[
1
],
Doctrine_Relation
::
ONE_AGGREGATE
);
$associationTable
->
bind
(
$definition
[
'table'
]
->
getComponentName
(),
$associationTable
->
getComponentName
()
.
'.'
.
$definition
[
'foreign'
],
Doctrine_Relation
::
ONE_AGGREGATE
);
// NORMAL MANY-TO-MANY RELATIONSHIP
$def
[
'table'
]
=
$associationTable
;
$def
[
'foreign'
]
=
$e2
[
1
];
$def
[
'local'
]
=
$definition
[
'local'
];
$def
[
'alias'
]
=
$e2
[
0
];
$def
[
'class'
]
=
$e2
[
0
];
$def
[
'type'
]
=
Doctrine_Relation
::
MANY_COMPOSITE
;
$this
->
relations
[
$e2
[
0
]]
=
new
Doctrine_Relation_ForeignKey
(
$def
);
$definition
[
'local'
]
=
$e2
[
1
];
$definition
[
'assocTable'
]
=
$associationTable
;
$relation
=
new
Doctrine_Relation_Association
(
$definition
);
}
}
}
$this
->
relations
[
$name
]
=
$relation
;
return
$this
->
relations
[
$name
];
}
// load all relations
$this
->
getRelations
();
if
(
$recursive
)
{
return
$this
->
getRelation
(
$name
,
false
);
}
else
{
throw
new
Doctrine_Table_Exception
(
$this
->
options
[
'name'
]
.
" doesn't have a relation to "
.
$name
);
}
}
/**
* returns an array containing all foreign key objects
*
* @return array
*/
final
public
function
getRelations
()
{
foreach
(
$this
->
bound
as
$k
=>
$v
)
{
$this
->
getRelation
(
$k
);
}
return
$this
->
relations
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment