Внутреннее объединение в массиве в laravel с данными - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть проблема в моем php / js-коде Laravel.

Теперь пользователь может видеть там созданные элементы задач, если пользователь создал элемент задачи для кого-то другого, приглашенный пользователь не может его увидеть.потому что он не был создан этим пользователем.

Я извлекаю данные из 2 таблиц, используя внутреннее соединение.Мой запрос находится в datatable в laravel, используя: https://github.com/yajra/laravel-datatables.

Моя таблица базы данных: todos, выглядит так: https://gyazo.com/2c4968a643f27cc757026408f784feaf

А моя таблица базы данных: пользователи, выглядит так: https://gyazo.com/b4b6a6b19218b7e6e1cdca6e3d40c4f1

Результат выглядит следующим образом:
https://gyazo.com/6efb8d790c45ab36bd9006e3583b9b83

Код запроса данных может быть следующим:

protected function newQuery()
    {
       // Gets the ID of the administrator
        $admin_id = UserController::getAdminUserId();

        if(isset($this->input['user_id_empty']) && $this->input['user_id_empty'] == '1') {
        $this->input['user_id'] = [];
        }

        $query = parent::newQuery()->withTrashed();


        $query->Join('users', function ($join) {
            $join->on('todos.created_by', '=', 'users.id');
        });

        $query->where('users.id', '!=', $admin_id);

        // if a user is selected from the dropdown option menu, excecute the query below.
        if(isset($this->input['user_id']) && is_array($user_ids = $this->input ['user_id']) && count($user_ids) > 0) {
            $query->whereNotNull('users.id')->whereIn('users.id', $user_ids);
        }

        $query->select([
            'todos.*', 'users.id AS users_id',
            'users.nick_name AS users_nick_name'
        ]);

        $query->orderby('todos.status','asc');

        return $query;
}

Запрос выбран по умолчанию для моеготаблица задачКак вы можете видеть, я использую внутреннее соединение в таблице users (users.id), теперь я извлекаю все элементы todo с внутренним соединением в таблице users.id (отсортировано по тому, кто создал элемент todo).Данные, которые я получаю прямо сейчас:

{
    "meta": {
    "page": 1,
    "pages": 1,
    "perpage": 10,
    "total": 3,
    "sort": "asc",
    "field": "id"
    },
    "data": [
        {
            "id": 1,
            "status": 0,
            "title": "test",
            "description": "",
            "mentions": [
                1,
                2,
                3
            ],
            "mentions_nick_name": "[\"Dev\"][\"Jobjen\"][\"test\"]",
            "created_by": 2,
            "deleted_at": null,
            "created_at": "2019-09-19 08:23:36",
            "updated_at": "2019-09-19 10:47:22",
            "users_id": 2,
            "users_nick_name": "Jobjen"
        },
        {
            "id": 2,
            "status": 0,
            "title": "test",
            "description": "",
            "mentions": [
                3
            ],
            "mentions_nick_name": "[\"test\"]",
            "created_by": 2,
            "deleted_at": null,
            "created_at": "2019-09-19 09:16:27",
            "updated_at": "2019-09-19 10:47:55",
            "users_id": 2,
            "users_nick_name": "Jobjen"
        },
        {
            "id": 3,
            "status": 0,
            "title": "testtgat",
            "description": "",
            "mentions": [
                1,
                3
            ],
            "mentions_nick_name": "[\"Dev\"][\"test\"]",
            "created_by": 2,
            "deleted_at": null,
            "created_at": "2019-09-19 09:16:30",
            "updated_at": "2019-09-19 10:47:37",
            "users_id": 2,
            "users_nick_name": "Jobjen"
        }
    ]
}

Я хотел бы получить эти данные, но не отсортировать (внутреннее объединение) в строке users.id, а в строке todos.mentions.Итак, что-то вроде:

$query->Join('users', function ($join) {
    $join->on(explode(',', 'todos.mentions'), '=', 'users.id');
});

Я знаю, что вышеприведенное объединение невозможно, это просто идея из того, что я хотел бы получить.

Код ниже - это код того, какЯ получаю данные запроса и использую их в таблице данных:

todo_datatable = $('.jotten-datatable-todo').JottenDataTable({
            data: {
                type: 'remote',
                source: {
                    read: {
                        url: $('.jotten-datatable-todo').attr('data-ajax-action'),
                        headers: {
                            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                        },
                        params: params
                    },
                },
                pageSize: 50,
                saveState: {
                    cookie: false,
                    webstorage: false
                },
                order: [],
                serverPaging: true,
                serverFiltering: true,
                serverSorting: false,
                sortable: true,
            },
            rows: {
                afterTemplate: function(row, data, index) {
                    row.find('[data-delete-todo]').on('click', function(e) {
                        deleteTodo($(this).data('delete-todo'));
                    });

                    row.find('[data-complete-todo]').on('click', function(e) {
                        completeTodo($(this).data('complete-todo'));
                    });
                },
            },
            columns: [
                {
                    field: 'id',
                    title: '@lang('Number')',
                    responsive: {visible: 'lg'},
                    width: 50,
                    template: function(row) {
                        return row.id;
                    }
                },
                {
                    field: 'created_by',
                    title: '@lang('Created by')',
                    width: 100,
                    template: function(row) {
                        return row.users_nick_name;
                    }
                },
                {
                    field: 'mentions',
                    title: '@lang('Users')',
                    width: 300,
                    template: function(row) {
                        let user_nick_name = row.mentions_nick_name;
                        let data_array = user_nick_name.split('"]["');
                        let return_data = '';

                        for(i = 0; i < data_array.length; i++) {
                            let userId = "<?php echo auth()->user()->id ?>";
                                // TODO: filer the user out that has created the todo item.
                                data_array[i] = data_array[i].replace('["', '');
                                data_array[i] = data_array[i].replace('"]', '');

                                return_data += jottenDisplayUser(data_array[i], row.mentions[i]);
                        }
                        return return_data;
                    }
                },
                {
                    field: 'title',
                    title: '@lang('Title')',
                    width: 200,
                    template: function(row) {
                        return nl2br(row.title);
                    }
                },
                {
                    field: 'description',
                    title: '@lang('Description')',
                    width: 200,
                    template: function(row) {
                        return nl2br(row.description);
                    }
                },
                {
                    field: 'status',
                    title: '@lang('Status')',
                    width: 100,
                    sortable: 'ASC',
                    template: function(row) {
                        // return row.status;

                        if(row.status == 0) {
                            return '<button class="btn btn-success" style="width: 80px !important;">Open</button>';
                        } else {
                            return '<button class="btn btn-warning" style="width: 80px !important; color: #ffffff">Closed</button>';
                        }
                    }
                },
                {
                    field: 'actions',
                    title: '@lang('Actions')',
                    width: 150,
                    template: function(row) {
                        let return_data = '';

                        if(row.deleted_at === null) {
                            return_data += '<a href="javascript:;" style="cursor:pointer;" data-complete-todo="' + row.id + '" class="btn btn-circle btn-success btn-elevate btn-icon margin-right"><i class="la la-check"></i></a>';
                            return_data += '<a href=\'edit/'+row.id+'/yes\' data-load-in-modal="#global_modal" class="btn btn-circle btn-icon btn-elevate btn-primary margin-right"><i class="la la-edit"></i></a>';
                        }

                        return_data += '<a href="javascript:;" style="cursor:pointer;" data-delete-todo="' + row.id + '" class="btn btn-circle btn-danger btn-elevate btn-icon margin-right"><i class="la la-trash"></i></a>';
                    return return_data;
                    }
                },
            ],
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...