雄辩的分离

时间:2019-01-27 20:10:14

标签: php laravel eloquent

我遇到此错误:

Call to undefined method Illuminate\Database\Query\Builder::detach()

它来自PollRepository:

public function destroy($id)
{
    // Ici on doit supprimer le sondage d'identifiant $id
    // Il faut nettoyer les tables "polls", "answers" et "poll_user" (pour cette dernière pensez à la méthode "detach" qui simplifie la syntaxe)
    $poll = Poll::findOrFail($id);
    $poll->answers()->detach();
    $poll->users()->detach();
    $poll->delete();
}

有必要清理表“ polls”,“ answers”和“ poll_user”(为此,最后一个要考虑简化语法的“ detach”方法)。

Relationships

2 个答案:

答案 0 :(得分:1)

这是因为findOrFail()方法返回Eloquent集合,而不返回Eloquent模型。使用firstOrFail()来获得口才模型投票。这样,您就可以使用detach()方法。

答案 1 :(得分:0)

由于detach()仅适用于多对多关系,因此您需要更改删除关系的方式。

从您的关系图中可以看出,PollAnswer之间的关系并不是多对多的,这很有意义。但是,PollUser具有多对多关系。

因此,以下方法应该起作用:

public function destroy($id)
{
    $poll = Poll::findOrFail($id);

    $poll->answers()->delete();
    $poll->users()->detach();

    $poll->delete();
}

:使用Model Events是一个很好的例子。您可以将deleting()事件添加到您的App\Poll模型中。

class Poll extends Model
{
    // 
    //

    public static function boot() {
        parent::boot();

        static::deleting(function($poll) { 
            $poll->answers()->delete();
            $poll->users()->detach();
        });
    }
}

...,然后每次删除轮询时,只需执行以下操作。

public function destroy($id)
{
    return Poll::findOrFail($id)->delete();
}

关系将被自动删除。