Отношения Laravel «многие ко многим» - отсоединить все и удалить, если больше ничего не прикреплено

В laravel я получил отношение «многие ко многим» между узлами и пользователями:

Узлы

    public function up()
    {
        Schema::create('nodes', function (Blueprint $table) {
            $table->bigIncrements('id')->index();

            $table->string('syncState')->nullable();
            $table->integer('jsonRpcPort')->nullable();
            $table->string('addr')->unique()->index();
            $table->BigInteger('height')->nullable();
            $table->string('nodeId')->nullable();
            $table->string('publicKey')->nullable()->index();
            $table->integer('websocketPort')->nullable();
            $table->integer('relayMessageCount')->nullable();
            $table->integer('sversion')->nullable();
            $table->string('version')->nullable();

            $table->timestamps();
        });
    }

В Node-Model:

    public function users()
    {
        return $this->belongsToMany('App\User')->withPivot('hostname', 'label', 'notified_offline', 'notified_outdated', 'notified_stuck');
    }

Пользователи

        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');

            $table->string('name');
            $table->string('email')->unique();
            $table->boolean('verified')->default(false);
            $table->string('password');

            $table->rememberToken();
            $table->timestamps();
        });

В пользовательской модели:

    public function nodes()
    {
        return $this->belongsToMany('App\Node')->withPivot('hostname', 'label', 'notified_offline', 'notified_outdated', 'notified_stuck');
    }

Node_user

    {
        Schema::create('node_user', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('node_id');

            $table->string('hostname')->nullable();
            $table->string('label')->nullable();
            $table->timestamp('notified_offline')->nullable();
            $table->timestamp('notified_outdated')->nullable();
            $table->timestamp('notified_stuck')->nullable();
            $table->timestamps();

            $table->foreign('user_id')
            ->references('id')->on('users')
            ->onDelete('cascade');

            $table->foreign('node_id')
            ->references('id')->on('nodes')
            ->onDelete('cascade');
        });
    }

Теперь, если я вызываю $user->nodes()->detach();, чтобы отсоединить все узлы от пользователя, я также хочу, чтобы — если к нему не подключен другой пользователь — эти узлы также должны быть удалены из базы данных.

Как мне это заархивировать? Я использую postgresql кстати.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
337
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, проще всего просто сделать проверку после вызова detach(). Laravel немного неточен с наблюдателями для поворотов, поэтому, если у вас есть detach() только в одном методе, возможно, что-то вроде приведенного ниже кода после действия detach().

Как насчет того, чтобы просто проверить узлы, у которых нет пользователя, а затем удалить их:

$nodesToDelete= Node::doesntHave('users')->pluck('id')->toArray();
Node::destroy($nodesToDelete);

Если вы хотите удалить только те, которые были только что отсоединены, соберите эти идентификаторы «для отсоединения» в массив, прежде чем отсоединять их, и добавьте в предложение whereIn в приведенной выше 1-й строке кода только для этих узлов.

Другие вопросы по теме