php - 使用 Laravel 的 Eloquent 删除 hasManyThrough 关系行

标签 php laravel eloquent has-many-through

我有三个模型:AdvertiserPtcAdPtcCampaign。删除广告商时,我想删除所有相关的PtcAdsPtcCampaigns广告商通过PtcAds有许多PtcCampaigns

广告商模型

use SoftDeletes;

protected $dates = ['deleted_at'];

public function ptcAds()
{
    return $this->hasMany('App\PtcAd');
}

public function ptcCampaigns()
{
    return $this->hasManyThrough('App\PtcCampaign', 'App\PtcAd');
}

public function delete()
{
    $this->ptcAds()->delete();
    // I'VE TRIED WITH AND WITHOUT THIS
    $this->ptcCampaigns()->delete();

    return parent::delete();
}

PtcAd 模型

use SoftDeletes;

protected $fillable = ['advertiser_id', 'title'];

protected $dates = ['deleted_at'];

public function advertiser()
{
    return $this->belongsTo('App\Advertiser');
}

public function ptcCampaigns()
{
    return $this->hasMany('App\ptcCampaign');
}

public function delete()
{
    $this->ptcCampaigns()->delete();

    return parent::delete();
}

PtcCampaign 模型

use SoftDeletes;

public $timestamps = false;

protected $fillable = ['ptc_ad_id', 'clicks'];

protected $dates = ['paused_at', 'deleted_at'];

public function ptcAd()
{
    return $this->belongsTo('App\PtcAd');
}

我的测试:

public function test_delete_advertiser()
{
    $advertiser = factory(Advertiser::class)->create();

    $ptcAd = factory(PtcAd::class)->create(['advertiser_id' => $advertiser->id]);

    $ptcCampaign = factory(PtcCampaign::class)->create(['ptc_ad_id' => $ptcAd->id]);

    $this->assertTrue($advertiser->delete());
    $this->assertFalse(Advertiser::all()->contains($advertiser));
    $this->assertFalse(PtcAd::all()->contains($ptcAd));

    // THE FOLLOWING TEST DOESN'T WORK!
    $this->assertFalse(PtcCampaign::all()->contains($ptcCampaign));
}

// ALL OF THE FOLLOWING TESTS WORK!
public function test_delete_ad()
{
    $ptcAd = factory(PtcAd::class)->create();

    $ptcCampaign = factory(PtcCampaign::class)->create(['ptc_ad_id' => $ptcAd->id]);

    $this->assertTrue($ptcAd->delete());
    $this->assertFalse(PtcAd::all()->contains($ptcAd));
    $this->assertFalse(PtcCampaign::all()->contains($ptcCampaign));
}

test_delete_advertiser() 测试中的 $this->assertFalse(PtcCampaign::all()->contains($ptcCampaign)) 失败,为什么?

我有更多的测试来确保所有关系都正常,所以我真的不知道可能出了什么问题。我的下一个尝试是在广告商的 delete() 方法中创建 foreach 但也许有更简单的方法,我想了解为什么这不起作用。

最佳答案

看来问题出在删除语句的顺序上。

尝试更改如下顺序:

public function delete()
{
    $this->ptcCampaigns()->delete();

    $this->ptcAds()->delete();

    return parent::delete();
}

关于php - 使用 Laravel 的 Eloquent 删除 hasManyThrough 关系行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40637205/

相关文章:

php - Laravel 5.5 发送数据查看而不重新加载页面

php - Laravel,多个 belongsto 和自动插入 ID?

php - Laravel:orderBy 带有集合的列

php - 在 MAMP 中使用 Laravel 设置 PostgreSQL

symfony - 在 Laravel 4 中使用 CssSelector

javascript - 使用 php 在输入类型 "datetime"中预设当前日期和时间

sql - 水平选择每组的第一条和最后一条记录

laravel select where 和 where 条件

php - 移动上传文件失败

php - 如何使用 MySQL SELECT 结果作为变量,然后在另一个 SELECT/UNION 语句中使用变量?