[Solved]Delete Row With Composite Pk

Good afternoon.

I have:


array(

           'class'=>'CButtonColumn',

           'template'=>'{delete}',

           'deleteButtonUrl' => 'array

                                     ("TvPactivosMedicamentos/delete", 

                                      array(

                                           "IdMedicamento"=>'.$IdMedicamento.',

                         "IdPrincipio_Activo"=>$data->FK_MPA_principios_activos->IdPrincipio_Activo

                                            )

                                      )',

            'deleteButtonLabel'=>'Eliminar',

            'deleteConfirmation' => "message", 

),

And when I press delete button, this error appears:

Error 400: Your request is invalid

My TvPactivosMedicamentosController.php is:


<?php


class TvPactivosMedicamentosController extends Controller

{

    public function actionDelete($IdMedicamento, $IdPrincipioActivo)

    {

        TvPactivosMedicamentos::model()->deleteByPk(

                                        array(

                                            'IdMedicamento'=>$IdMedicamento,

                                            'IdPrincipio_Activo'=>$IdPrincipioActivo,

        ));


        // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

        if(!isset($_GET['ajax']))

            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('update'));

    }

}

Any idea?

Thanks.

No one had the same problem?

Help, please.

P.D.:

Firebug notice: Your request is invalid.

Well, the request now works.

I fixed this by changing the deleteButtonUrl to:




'deleteButtonUrl' =>'array(

"index.php?r=tvPactivosMedicamentos/delete",

"IdMedicamento"=>'.$IdMedicamento.',

"IdPrincipio_Activo"=>$data->FK_MPA_principios_activos->IdPrincipio_Activo

)',



This same thing happens with other AJAX functions. What is the problem?

But it doesn’t delete data.

controller code




    public function actionDelete($IdMedicamento, $IdPrincipioActivo)

    {

        $this->loadModel($IdMedicamento, $IdPrincipioActivo)->delete();


        // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

        if(!isset($_GET['ajax']))

            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('update'));

    }


    public function loadModel($IdMedicamento, $IdPrincipio_Activo)

    {

        $model=ToUnidades::model()->findByPk($IdMedicamento, $IdPrincipio_Activo);

        

        if($model===null)

            throw new CHttpException(404,'A páxina solicitada non existe.');

        

        return $model;

    }



Any suggestion?

I have not solved the problem.




'deleteButtonUrl' =>'array(

"index.php?r=tvPactivosMedicamentos/delete",

"IdMedicamento"=>'.$IdMedicamento.',

"IdPrincipio_Activo"=>$data->FK_MPA_principios_activos->IdPrincipio_Activo

)',

Do not run the delete action.

Firebug shows this:


.../index.php?r=&IdPrincipio_Activo=27&IdMedicamento=2&ajax=child-grid

r isn’t assigned!!!

Help.

I resolve request issue with:




'deleteButtonUrl' =>'array("TvPactivosMedicamentos/delete",

"IdPrincipio_Activo"=>$data->FK_MPA_principios_activos->IdPrincipio_Activo,

"IdMedicamento"=>'.$IdMedicamento.'

)',



But I have this problem when the action in launched:




Error 500: <h1>CDbException</h1>

<p>The "IdPrincipio_Activo" field value isn't supplied when querying the table "tv_pactivos_medicamentos". (C:\xampp\htdocs\yii\framework\db\schema\CDbCommandBuilder.php:686)</p><pre>#0 C:\xampp\htdocs\yii\framework\db\schema\CDbCommandBuilder.php(498): CDbCommandBuilder->createInCondition(Object(CMysqlTableSchema), Array, Array, '`t`.')

#1 C:\xampp\htdocs\yii\framework\db\ar\CActiveRecord.php(1425): CDbCommandBuilder->createPkCriteria(Object(CMysqlTableSchema), '27', '2', Array, '`t`.')

#2 C:\xampp\htdocs\CREFSA\protected\controllers\TvPactivosMedicamentosController.php(46): CActiveRecord->findByPk('27', '2')

#3 C:\xampp\htdocs\CREFSA\protected\controllers\TvPactivosMedicamentosController.php(34): TvPactivosMedicamentosController->loadModel('27', '2')

#4 [internal function]: TvPactivosMedicamentosController->actionDelete('27', '2')

#5 C:\xampp\htdocs\yii\framework\web\actions\CAction.php(107): ReflectionMethod->invokeArgs(Object(TvPactivosMedicamentosController), Array)

#6 C:\xampp\htdocs\yii\framework\web\actions\CInlineAction.php(48): CAction->runWithParamsInternal(Object(TvPactivosMedicamentosController), Object(ReflectionMethod), Array)

#7 C:\xampp\htdocs\yii\framework\web\CController.php(309): CInlineAction->runWithParams(Array)

#8 C:\xampp\htdocs\yii\framework\web\filters\CFilterChain.php(134): CController->runAction(Object(CInlineAction))

#9 C:\xampp\htdocs\yii\framework\web\CController.php(1117): CFilterChain->run()

#10 C:\xampp\htdocs\yii\framework\web\filters\CInlineFilter.php(59): CController->filterPostOnly(Object(CFilterChain))

#11 C:\xampp\htdocs\yii\framework\web\filters\CFilterChain.php(131): CInlineFilter->filter(Object(CFilterChain))

#12 C:\xampp\htdocs\yii\framework\web\filters\CFilter.php(41): CFilterChain->run()

#13 C:\xampp\htdocs\yii\framework\web\CController.php(1146): CFilter->filter(Object(CFilterChain))

#14 C:\xampp\htdocs\yii\framework\web\filters\CInlineFilter.php(59): CController->filterAccessControl(Object(CFilterChain))

#15 C:\xampp\htdocs\yii\framework\web\filters\CFilterChain.php(131): CInlineFilter->filter(Object(CFilterChain))

#16 C:\xampp\htdocs\yii\framework\web\CController.php(292): CFilterChain->run()

#17 C:\xampp\htdocs\yii\framework\web\CController.php(266): CController->runActionWithFilters(Object(CInlineAction), Array)

#18 C:\xampp\htdocs\yii\framework\web\CWebApplication.php(283): CController->run('delete')

#19 C:\xampp\htdocs\yii\framework\web\CWebApplication.php(142): CWebApplication->runController('TvPactivosMedic...')

#20 C:\xampp\htdocs\yii\framework\base\CApplication.php(162): CWebApplication->processRequest()

#21 C:\xampp\htdocs\CREFSA\index.php(13): CApplication->run()

#22 {main}</pre>



What happen?

Hi lagogz,

it happened same with me…for composite key we cant do so…

i did like this… it works :)

Movies::model()->findByAttributes(array(‘name’ => $obj->name))->delete();

Cheers :)

you can also do like table level deletion when the parent row gets deleted… you can use ON DELETE CASCATE to delete composite key entry automatically with parent record.

Thanks for your reply, but I think the problem isn’t this.

I get this error when actionDelete is launched:





Error 500: <h1>CDbException</h1>

<p>The "IdPrincipio_Activo" field value isn't supplied when querying the table "tv_pactivos_medicamentos". (C:\xampp\htdocs\yii\framework\db\schema\CDbCommandBuilder.php:686)</p><pre>#0 C:\xampp\htdocs\yii\framework\db\schema\CDbCommandBuilder.php(498): CDbCommandBuilder->createInCondition(Object(CMysqlTableSchema), Array, Array, '`t`.')

#1 C:\xampp\htdocs\yii\framework\db\ar\CActiveRecord.php(1425): CDbCommandBuilder->createPkCriteria(Object(CMysqlTableSchema), '27', '2', Array, '`t`.')

#2 C:\xampp\htdocs\CREFSA\protected\controllers\TvPactivosMedicamentosController.php(46): CActiveRecord->findByPk('27', '2')

#3 C:\xampp\htdocs\CREFSA\protected\controllers\TvPactivosMedicamentosController.php(34): TvPactivosMedicamentosController->loadModel('27', '2')

#4 [internal function]: TvPactivosMedicamentosController->actionDelete('27', '2')

#5 C:\xampp\htdocs\yii\framework\web\actions\CAction.php(107): ReflectionMethod->invokeArgs(Object(TvPactivosMedicamentosController), Array)

#6 C:\xampp\htdocs\yii\framework\web\actions\CInlineAction.php(48): CAction->runWithParamsInternal(Object(TvPactivosMedicamentosController), Object(ReflectionMethod), Array)

#7 C:\xampp\htdocs\yii\framework\web\CController.php(309): CInlineAction->runWithParams(Array)

#8 C:\xampp\htdocs\yii\framework\web\filters\CFilterChain.php(134): CController->runAction(Object(CInlineAction))

#9 C:\xampp\htdocs\yii\framework\web\CController.php(1117): CFilterChain->run()

#10 C:\xampp\htdocs\yii\framework\web\filters\CInlineFilter.php(59): CController->filterPostOnly(Object(CFilterChain))

#11 C:\xampp\htdocs\yii\framework\web\filters\CFilterChain.php(131): CInlineFilter->filter(Object(CFilterChain))

#12 C:\xampp\htdocs\yii\framework\web\filters\CFilter.php(41): CFilterChain->run()

#13 C:\xampp\htdocs\yii\framework\web\CController.php(1146): CFilter->filter(Object(CFilterChain))

#14 C:\xampp\htdocs\yii\framework\web\filters\CInlineFilter.php(59): CController->filterAccessControl(Object(CFilterChain))

#15 C:\xampp\htdocs\yii\framework\web\filters\CFilterChain.php(131): CInlineFilter->filter(Object(CFilterChain))

#16 C:\xampp\htdocs\yii\framework\web\CController.php(292): CFilterChain->run()

#17 C:\xampp\htdocs\yii\framework\web\CController.php(266): CController->runActionWithFilters(Object(CInlineAction), Array)

#18 C:\xampp\htdocs\yii\framework\web\CWebApplication.php(283): CController->run('delete')

#19 C:\xampp\htdocs\yii\framework\web\CWebApplication.php(142): CWebApplication->runController('TvPactivosMedic...')

#20 C:\xampp\htdocs\yii\framework\base\CApplication.php(162): CWebApplication->processRequest()

#21 C:\xampp\htdocs\CREFSA\index.php(13): CApplication->run()

#22 {main}</pre>



[size="5"]SOLVED[/size]

I’m dumb.

Yii Framework Class Reference says in findByPk() method for CActiveRecord:




public CActiveRecord findByPk(mixed $pk, mixed $condition='', array $params=array ( ))



Where mixed $pk is : "primary key value(s). Use array for multiple primary keys. For composite key, each key value must be an array (column name=>column value)."

[size="4"][b]

ARRAY!!!!![/b][/size]

Then, in my controller:




public function loadModel($IdPrincipio_Activo, $IdMedicamento)

    {

        $model=TvPactivosMedicamentos::model()->findByPk(

                                            array(

                                                'IdPrincipio_Activo'=>$IdPrincipio_Activo, 

                                                'IdMedicamento'=>$IdMedicamento)

        );

        

        if($model===null)

            throw new CHttpException(404,'A páxina solicitada non existe.');

        

        return $model;

    }



Thank you developer! for reply!!

Regards.

A little different approach in my code:

Model:


public function primaryKey()

{

    return array('firstField', 'secondField', 'thirdField');

}



Controller:




public function actionDelete(array $id)

{

	if(Yii::app()->request->isPostRequest)

	{

		// we only allow deletion via POST request & check if $id is an array

		if(is_array($id))

		{

			if($this->loadModel($id)->delete())

			{

				$this->redirect($_SERVER['HTTP_REFERER']);

			}

		}

		else

			throw new CHttpException(400,'ID is not an array.');

	}

	else

		throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

}



View:




echo CHtml::link(CHtml::image('images/close.png'),'javascript:void(0)', array(

    'submit'=>array('/controllerName/actionName', 'id'=>$model->primaryKey), 

    'confirm' => 'Sure to delete?',

    'title' => 'Delete data',

)); 



Hope this helps someone. Thanks.