У меня есть проблема в моем 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;
}
},
],
});