Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 20.02.2018 11:23:44

НЕ вызывается цикл в цикле удаления связанных данных

Всем привет, 

В laravel 5.5 приложения удаляю строку со связанными строками

    public function destroy($id)
    {
        try {

            DB::beginTransaction();
            $userChat = UserChat::find($id);
            if ($userChat == null) {
                return response()->json(['error_code' => 11, 'message' => 'User chat # "' . $id . '" not found!', 'userChat' => null],
                    HTTP_RESPONSE_INTERNAL_SERVER_ERROR);
            }
            $userChat->delete();
            DB::commit();

        } catch (Exception $e) {
            DB::rollBack();
            return response()->json(['error_code' => 1, 'message' => $e->getMessage(), 'userChat' => null], HTTP_RESPONSE_INTERNAL_SERVER_ERROR);
        }

        return response()->json(['error_code' => 0, 'message' => ''], HTTP_RESPONSE_OK);
    }

В app/UserChat.php описаны отношения со связанными таблицами:


<?php
namespace App;

use DB;
use App\MyAppModel;
use App\User;
use App\Task;
use App\UserChatMessage;
use App\UserChatParticipant;
use App\UserChatLastVisited;
use App\UserChatMessageDocument;
use App\UserChatNewMessage;
use App\library\ListingReturnData;
use App\Events\UserChatUpdatingEvent;
use App\Rules\CheckUserChatParticipantSelected;

class UserChat extends MyAppModel
{

    protected $table = 'user_chats';
    protected $primaryKey = 'id';
    public $timestamps = false;

    protected $dispatchesEvents = [
        'updating' => UserChatUpdatingEvent::class,
    ];

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

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

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

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


    public function task()
    {
        return $this->hasOne('App\Task');
    }

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

        self::deleting(function($userChat) {
            $userChat->userChatParticipants()->delete();
            echo '<pre>BEFORE DELETE $userChat->userChatMessages()->delete()::'.print_r(-5,true).'</pre>'; // Эта строка отладки выводится
            $userChat->userChatMessages()->delete();
            $userChat->userChatMessageDocuments()->delete();
            $userChat->userChatLastVisited()->delete();
        });

    }

Также существует класс UserChatNewMessage определенный в app/UserChatNewMessage.php:

<?php
namespace App;

use DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;

use Intervention\Image\Facades\Image as Image;

use App\MyAppModel;
use App\User;
use App\Config;
use App\UserChatMessage;
use App\library\ListingReturnData;

class UserChatNewMessage extends MyAppModel
{

    protected $table = 'user_user_chat_new_messages';
    protected $primaryKey = 'id';
    public $timestamps = false;

    protected $userChatNewMessageImagePropsArray = [];
    protected $fillable = [ 'user_chat_message_id', 'user_id' ];

    public function userChatMessage(){
        return $this->belongsTo('App\UserChatMessage', 'user_chat_message_id','id');
    }

Этот класс свзян с классом userChatMessage поэтому в определеннии этого класса я определяю метод для удаления связанных данных :


<?php
namespace App;

use DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
use App\MyAppModel;
use App\User;
use App\Task;
use App\UserProfileDocument;
use App\DocumentCategory;
use App\UserChatNewMessage;
use App\library\ListingReturnData;
use App\Events\UserChatMessageUpdatingEvent;

class UserChatMessage extends MyAppModel
{

    protected $fillable = [ 'user_id', 'user_chat_id', 'is_top', 'text'];

    protected $table = 'user_chat_messages';
    protected $primaryKey = 'id';
    public $timestamps = false;
    
    protected $dispatchesEvents = [
        'updating' => UserChatMessageUpdatingEvent::class,
    ];

    public function user(){
        return $this->belongsTo('App\User', 'user_id','id');
    }

    public function userChat(){
        return $this->belongsTo('App\UserChat', 'user_chat_id','id');
    }

    public function userChatNewMessages()
    {
        echo '<pre>userChatNewMessages -13::'.print_r(-13,true).'</pre>';
        return $this->hasMany('App\UserChatNewMessage');
    }

    protected static function boot() {
        parent::boot();
        
        echo '<pre>boot -1::'.print_r(-1,true).'</pre>';  // Это сообщение выводится
        self::deleting(function(UserChatMessage $userChatMessage) { 
            echo '<pre>boot $userChatMessage->id::'.print_r($userChatMessage->id,true).'</pre>';  // Это сообщение НЕ ВЫВОДИТСЯ
            $userChatMessage->userChatNewMessages()->delete();
        });
    }

Я как раз не пойму почему НЕ вызывается цикл

        self::deleting(function(UserChatMessage $userChatMessage) { 

и соотвественно строки userChatNewMessages не удаляются ?

Что-то упустил в описании моделей?

Спасибо!

Не в сети

Подвал раздела