如何在yii2中使用join删除数据

如何在yii2中使用join删除数据,yii2,Yii2,我使用以下查询删除所有与给定id我的代码相关的对应数据: public function actionDeletebyajax() { $pid = $_POST['id']; if($pid) { $this->findModel($pid)->delete(); Profile::deleteAll('user_id ='.$pid); UserLoyalty::deleteAll('store_id ='

我使用以下查询删除所有与给定id我的代码相关的对应数据:

  public function actionDeletebyajax() 

  {
  $pid = $_POST['id'];   
  if($pid) {
        $this->findModel($pid)->delete();
        Profile::deleteAll('user_id ='.$pid);
        UserLoyalty::deleteAll('store_id ='.$pid);
        Workorderpopup::deleteAll('workorder_id ='.$pid); 
        Deal::deleteAll('workorder_id ='.$pid); 
        WorkorderCategory::deleteAll('workorder_id ='.$pid);
        store::deleteAll('owner ='.$pid);
        workorders::deleteAll('workorder_id ='.$pid); 
       echo $pid; exit;
 }
 } 

但是这里我想要的
Workorderpopup
有一个子表
Workorderpopup\u child
我想要删除所有的子记录,但是子表与
$pid
没有任何关系也有办法删除子记录吗?

假设这个关系是
Workorderpopup\u child.Workorderpopup\u id
>
workorderpopup.id

可能是这样的

条件中的级联删除

$workorderpopups = Workorderpopup::find()
    ->select('id')
    ->where(['workorder_id' => $pid])
    ->asArray()->all();

Workorderpopup_child::deleteAll(['in', 'workorderpopup_id', array_values($workorderpopups)]);
或者像这样:

按关系取消链接级联删除

$workorderpopups = Workorderpopup::find()
    ->select('id')
    ->where(['workorder_id' => $pid])
    ->asArray()->all();

foreach ($workorderpopups as $workorderpopup) {
    $workorderpopup->delete();
}
然后覆盖您的
Workorderpopup->delete()
,如下所示

/**
 * @inheritdoc
 */
public function delete()
{
    $this->unlinkAll('workorderpopup_child', true);        

    return parent::delete();
}
并确保您在
workorderpopup
类中具有相应的关系
workorderpopup\u child

/**
 * @return \yii\db\ActiveQuery
 */
public function getWorkorderpopup_child()
{
    return $this->hasMany(Workorderpopup_child::className(), ['workorderpopup_id' => 'id']);
}

p、 我还没有测试上面的代码,所以假设关系是
workorderpopup\u child.workorderpopup\u id
->
workorderpopup.id
,这里可能会有一些错误

可能是这样的

条件中的级联删除

$workorderpopups = Workorderpopup::find()
    ->select('id')
    ->where(['workorder_id' => $pid])
    ->asArray()->all();

Workorderpopup_child::deleteAll(['in', 'workorderpopup_id', array_values($workorderpopups)]);
或者像这样:

按关系取消链接级联删除

$workorderpopups = Workorderpopup::find()
    ->select('id')
    ->where(['workorder_id' => $pid])
    ->asArray()->all();

foreach ($workorderpopups as $workorderpopup) {
    $workorderpopup->delete();
}
然后覆盖您的
Workorderpopup->delete()
,如下所示

/**
 * @inheritdoc
 */
public function delete()
{
    $this->unlinkAll('workorderpopup_child', true);        

    return parent::delete();
}
并确保您在
workorderpopup
类中具有相应的关系
workorderpopup\u child

/**
 * @return \yii\db\ActiveQuery
 */
public function getWorkorderpopup_child()
{
    return $this->hasMany(Workorderpopup_child::className(), ['workorderpopup_id' => 'id']);
}

p、 我还没有测试上面的代码,所以这里可能有一些错误

,但它与
Workorderpopup
有关。您可以查找并删除它们,然后删除
Workorderpopup
。在数据库中的级联删除上定义关系,或定义触发器方法,如beforeDelete(),但它与
Workorderpopup
有关系。您可以找到并删除它们,然后删除
Workorderpopup
。在数据库中定义级联删除上的关系或定义触发器方法,如beforeDelete()