Проверьте, есть ли у него связанный элемент перед удалением в CakePHP - PullRequest
1 голос
/ 13 июня 2011

Я хотел бы проверить, чтобы перед удалением Venue к нему не было привязано Events.

Venue hasMany Event
Event belongsTo Venue

Я думаю, я бы сделал этов функции beforeDelete в моей модели Venue - но - кроме этого, я не уверен, как проверять наличие событий ... я должен как-то включать доступ к модели событий?Если это не удается, есть ли способ вернуть конкретное сообщение об ошибке, как позволяет проверка?Или ... я делаю это в самой проверке?

Ответы [ 4 ]

2 голосов
/ 14 июня 2011

Это должно делать то, что вам нужно.Он будет проверять количество событий перед удалением места, затем, если количество больше 0, он вернет false, предотвращая удаление.Иначе, он будет удален, если нет связанных событий.

// using app/models/venue.php
// In the following example, do not let a venue delete if it still contains events.
// A call of $this->Venue->delete($id) from VenueController.php has set $this->id .
// Assuming 'Venue hasMany Event', we can access $this->Event in the model.
function beforeDelete(){
    $count = $this->Event->find("count", array("conditions" => array("venue_id" => $this->id)));
    if ($count == 0) {
        return true;
    } else {
        return false;
    }
}

Или вы можете сделать это:

В вашей модели добавьте этот метод

function hasEvents($venue_id){
    $count = $this->Event->find("count", array("conditions" => array("venue_id" => $venue_id)));
    if ($count == 0) {
        return false;
    } else {
        return true;
    }
}

В вашем контроллере

if($this->Venue->hasEvents($venue_id)){
    //display error message that you cannot delete because venue has events
} else {
    $this->Venue->delete($venue_id);
}
0 голосов
/ 31 мая 2018

для использования cakephp 3.5.1 попробуйте это ..

в Модели продуктов

Продукты относятся к категориям

в категориях контроллер

public function delete($id = null)
{
    $this->request->allowMethod(['post', 'delete']);
    if($this->checkassociated($id) > 0){
        $this->Flash->error(__('this category could not be deleted.'));
    }else{
        $category = $this->Categories->get($id);
        if ($this->Categories->delete($category)) {
            $this->Flash->success(__('this category has been deleted.'));
        } else {
            $this->Flash->error(__('this category could not be deleted.'));
        }
    }
    return $this->redirect(['action' => 'index']);
}

public function checkassociated($category_id){
    $itemsTable = TableRegistry::get('Products');
    $itemdata = $itemsTable->find('all')
        ->where(['Products.category_id'=>$category_id]);
    $number = $itemdata->count();
    return $number;
}
0 голосов
/ 09 июня 2016

используйте это поведение:

<?php
/**
 * Prevent deletion if child record found
 *
 * @author    Nik Chankov
 * @url    http://nik.chankov.net
 */
class HasChildrenBehavior extends ModelBehavior {
    /**
     * Empty Setup Function
    */
    function setup(&$model) {
        $this->model = $model;
    }

    /**
     * Run the check and cancel the deletion if child is found
     * @access public
     */
    function beforeDelete(){
        if(isset($this->model->hasMany)){
            foreach($this->model->hasMany as $key=>$value){
                $childRecords = $this->model->{$key}->find('count', array('conditions'=>array($value['foreignKey']=>$this->model->id)));
                if($childRecords > 0){
                    return false;
                }
            }
        }
        //Checking habtm relation as well, thanks to Zoltan
        if(isset($this->model->hasAndBelongsToMany)){
            foreach($this->model->hasAndBelongsToMany as $key=>$value){
                $childRecords = $this->model->{$key}->find('count', array('conditions'=>array($value['foreignKey']=>$this->model->id)));
                if($childRecords > 0){
                    return false;
                }
            }
        }
        return true;
    }
}
?>

ИСТОЧНИК: http://nik.chankov.net/2007/10/23/check-for-existing-childs-behaviour/

НТН.

0 голосов
/ 13 июня 2011

Я новичок в CakePHP, поэтому, пожалуйста, примите этот ответ с недолгой солью.

Я полагаю, поскольку у Venue есть отношение к Event, вы можете получить к нему доступ без каких-либо изменений, например:

$ this-> Event ...

от модели объекта или контроллера.

После этого вы сможете использовать запрос для поиска любого события в этом месте.

...