Cakephp обновляет другую таблицу при смене поля - PullRequest
0 голосов
/ 05 июня 2018

У меня есть 2 таблицы: Клиенты и Активы Назначения.Таблица клиентов имеет поле: is_active.

В режиме редактирования, когда is_active изменяется с TRUE на FALSE, мне нужно обновить таблицу назначений, установив end_date = TODAY для всех assets_assignations выбранного клиента.

AssetsAssignations содержит следующие поля: (id, asset_id, client_id, room_id, ip_address, начальная_дата, конечная_дата).В AssetsAssignationsTable:

public function initialize(array $config)
{
    parent::initialize($config);

    $this->table('assets_assignations');
    $this->displayField('id');
    $this->primaryKey('id');

    $this->belongsTo('Assets', [
        'foreignKey' => 'asset_id'
    ]);
    $this->belongsTo('Clients', [
        'foreignKey' => 'client_id'
    ]);
    $this->belongsTo('Rooms', [
        'foreignKey' => 'room_id'
    ]);

}

В ClientsTable:

public function initialize(array $config)
{
    parent::initialize($config);

    $this->table('clients');
    $this->DisplayField('full_name');
    $this->primaryKey('id');

    $this->hasMany('AssetsAssignations', [
        'foreignKey' => 'client_id'
    ]);

    ....
}

Это моя функция редактирования для клиентов:

public function edit($id = null)
{
    $client = $this->Clients->get($id, [
        'contain' => []
    ]);
    if ($this->request->is(['patch', 'post', 'put'])) {
        $client = $this->Clients->patchEntity($client, $this->request->data);
        if ($this->Clients->save($client)) {
            $this->Flash->success(__('The client has been saved.'));

            return $this->redirect(['action' => 'index']);
        }
        $this->Flash->error(__('The client could not be saved. Please, try again.'));
    }
    $clientTypes = $this->Clients->ClientTypes->find('list', ['limit' => 200]);
    $this->set(compact('client', 'clientTypes'));
    $this->set('_serialize', ['client']);
}

1 Ответ

0 голосов
/ 07 июня 2018

Моя рекомендация:

В ClientsTable.php добавьте

use ArrayObject;
use Cake\Datasource\EntityInterface;
use Cake\Event\Event;
use Cake\I18n\FrozenDate;

/**
 * Perform additional operations after it is saved.
 *
 * @param \Cake\Event\Event $event The afterSave event that was fired
 * @param \Cake\Datasource\EntityInterface $entity The entity that was saved
 * @param \ArrayObject $options The options passed to the save method
 * @return void
 */
public function afterSave(Event $event, EntityInterface $entity, ArrayObject $options) {
    // For CakePHP 3.4.3 or later, use isDirty instead of dirty
    if (!$entity->isNew() && $entity->dirty('is_active') && !$entity->is_active) {
        $this->AssetsAssignations->updateAll(['end_date' => FrozenDate::now()], ['client_id' => $entity->id]);
    }
}

Поместив этот код в обработчик события afterSave, вы гарантированно произойдете в любое время, когда is_activeфлаг изменен на false независимо от того, происходит ли это изменение на странице редактирования или в другом месте.(Возможно, больше нигде не будет обновлять это сейчас, но это защищает вас в будущем, если что-то подобное будет добавлено позже.)

...