Как и большинство новичков в теге C, на этот вопрос можно ответить, вернувшись к первым принципам:
&
превращает переменную в указатель. *
превращает указатель в переменную. (Технически я должен сказать «lvalue» вместо «variable», но я считаю более понятным описать изменяемые места хранения как «переменные».)
Итак, у нас есть переменные:
int i = 5, j = 6;
int *ip1 = &i, *ip2 = &j;
Переменная ip1
содержит указатель . Оператор &
превращает i
в указатель, и этому значению указателя присваивается значение ip1
. Таким образом, ip1
содержит указатель на i
.
Переменная ip2
содержит указатель . Оператор &
превращает j
в указатель, а указатель присваивается ip2
. Поэтому ip2
содержит указатель на j
.
int **ipp = &ip1;
Переменная ipp
содержит указатель. Оператор &
превращает переменную ip1
в указатель и значение указателя присваивается ipp
. Таким образом, ipp
содержит указатель на ip1
.
Подведем итог истории:
i
содержит 5 j
содержит 6 ip1
содержит «указатель на i
» ip2
содержит «указатель на j
» ipp
содержит «указатель на ip1
» Теперь мы говорим
*ipp = ip2;
Оператор *
возвращает указатель обратно в переменную. Мы получаем значение ipp
, которое является «указателем на ip1
и превращает его в переменную. Какую переменную? ip1
, конечно!
Поэтому это просто еще один способ сказать
ip1 = ip2;
Итак, мы получаем значение ip2
.Какой это? "указатель на j
". Мы присваиваем этому указателю значение ip1
, поэтому ip1
теперь «указатель на j
"
Мы только изменили одно: значение ip1
:
i
содержит 5 j
содержит 6 ip1
содержит «указатель на j
» ip2
содержит «указатель на j
» ipp
содержит «указатель на ip1
"Почему
blockquote>ipp
все еще указывает наip1
, а неip2
?Изменяется переменная, когда вы назначаете ему. Подсчитайте назначения: переменные не могут быть больше, чем есть назначения! Вы начинаете с назначения
i
,j
,ip1
,ip2
иipp
. Затем вы назначаете*ipp
, который, как мы видели, означает то же самое, что «присваиватьip1
». Поскольку вы не назначалиipp
во второй раз, это не изменилось!Если вы хотите изменить
ipp
, вам действительно нужно назначитьipp
:ipp = &ip2;
например.
Вы можете попробовать следующее:
$paginate = [
'joins' => array(
array(
'table' => 'properties',
'alias' => 'Property',
'type' => 'LEFT',
'conditions' => array(
'Deals.property_id = Property.id'
)
),
array(
'table' => 'clients',
'alias' => 'Client',
'type' => 'LEFT',
'conditions' => array(
'Deals.client_id = Client.id'
)
),
array(
'table' => 'properties_flats',
'alias' => 'PropertyFlat',
'type' => 'LEFT',
'conditions' => array(
'Deals.properties_flat_id = PropertyFlat.id'
)
)
),
'fields' => array(
'Deals.id',
'Deals.deed_amount',
'Deals.other_amount',
'Deals.cash_amount',
'Deals.total_amount',
'Deals.client_id',
'Deals.project_id',
'Deals.property_id',
'Deals.properties_flat_id',
'Deals.date',
'Deals.status',
'Deals.invoice_no',
'Deals.remain_cash_amount',
'Deals.remain_deed_amount',
'Deals.remain_other_amount',
'Deals.remain_deed_amount',
'Property.name',
'Client.name',
'PropertyFlat.name',
'PropertyFlat.status'
)
];
$this->set('deals', $this->Paginator->paginate($this->Deals->find('all'), $paginate)->toArray());
Во-первых, я бы рекомендовал переосмыслить то, как вы построили свой запрос. Почему бы вам просто не использовать метод contains () для извлечения связанных данных?
Во-вторых, вы можете использовать пользовательские поисковые устройства с помощью paginator. Просто создайте его в своем классе Table и верните построенный запрос из него и попросите его использовать его. Подробнее читайте здесь. https://book.cakephp.org/3.0/en/controllers/components/pagination.html