Laravel отношения многие ко многим - отсоедините все и удалите, если ничего не прикреплено - PullRequest
1 голос
/ 29 июня 2019

В 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 кстати.

1 Ответ

1 голос
/ 30 июня 2019

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

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

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

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

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