Красноречивый отрыв - PullRequest
0 голосов
/ 27 января 2019

У меня есть эта ошибка:

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

Происходит из репозитория Poll:

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"(для этого последнего рассмотрим метод «отсоединить», который упрощает синтаксис).

Отношения

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Это потому, что метод findOrFail() возвращает коллекцию Eloquent, но не модель Eloquent.Вместо этого используйте firstOrFail(), чтобы получить опрос модели Eloquent.Таким образом, вы сможете использовать метод detach ().

0 голосов
/ 27 января 2019

Поскольку detach() доступен только для отношений «многие ко многим», вам необходимо изменить способ удаления отношений.

Из вашей диаграммы отношений кажется, что отношения между Poll и Answer не являются многим для многих, что имеет смысл.Тем не менее, Poll и User имеют отношение многие ко многим.

Таким образом, должно работать следующее:

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

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

    $poll->delete();
}

Или: Это хороший случай для использования События модели .Вы можете добавить событие 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();
}

Отношения будут удалены автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...