1: <?php
2:
3: namespace PHPixie\ORM\Planners\Planner\Pivot\Strategy;
4:
5: class SQL extends \PHPixie\ORM\Planners\Planner\Pivot\Strategy
6: {
7: protected $productAlias = 'insert_product';
8: protected $idQueryAliasPrefix = 'id_query_';
9:
10: public function link($pivot, $firstSide, $secondSide, $plan)
11: {
12: $pivotTable = $pivot->source();
13:
14: $sides = array(
15: 'first' => $firstSide,
16: 'second' => $secondSide,
17: );
18:
19: $sideData = array();
20: foreach ($sides as $name => $side) {
21: $idField = $side->repository()->config()->idField;
22: $alias = $this->idQueryAliasPrefix.$name;
23: $sideData[] = array(
24: 'query' => $this->idQuery($side, $plan),
25: 'queryAlias' => $alias,
26: 'productIdField' => $alias.'.'.$idField,
27: 'productAlias' => $name,
28: 'productKey' => $this->productAlias.'.'.$name,
29: 'pivotKey' => $side->pivotKey(),
30: 'fullPivotKey' => $pivotTable.'.'.$side->pivotKey(),
31: );
32: }
33:
34: $productQuery = $pivot->connection()->selectQuery()
35: ->fields(array(
36: $sideData[0]['productAlias'] => $sideData[0]['productIdField'],
37: $sideData[1]['productAlias'] => $sideData[1]['productIdField']
38: ))
39: ->table($sideData[0]['query'], $sideData[0]['queryAlias'])
40: ->join($sideData[1]['query'], $sideData[1]['queryAlias'], 'cross');
41:
42: $filteredQuery = $pivot->connection()->selectQuery()
43: ->fields(array($sideData[0]['productKey'], $sideData[1]['productKey']))
44: ->table($productQuery, $this->productAlias)
45: ->join($pivotTable, null, 'left_outer')
46: ->on($sideData[0]['productKey'], $sideData[0]['fullPivotKey'])
47: ->on($sideData[1]['productKey'], $sideData[1]['fullPivotKey'])
48: ->where($sideData[0]['fullPivotKey'], null);
49:
50: $insertQuery = $pivot->connection()->insertQuery()
51: ->table($pivotTable)
52: ->batchData(
53: array(
54: $sideData[0]['pivotKey'],
55: $sideData[1]['pivotKey']
56: ),
57: $filteredQuery
58: );
59:
60: $queryStep = $this->steps->query($insertQuery);
61: $plan->add($queryStep);
62:
63: }
64: }
65: