Laravel: как удалить строку уведомления базы данных по данным-> postid

avatar
Saurabh Mistry
8 апреля 2018 в 09:50
2333
4
1

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

https://laravel.com/docs/5.5/notifications#database-notifications

моё приложение успешно смогло создать уведомление базы данных следующим образом

таблица: уведомления

идентификатор | тип | уведомляемый_id | уведомляемый_тип | данные | read_at | created_at | updated_at

id = 0b2a7fdf-eea4-4982-a86d-e874bb4f28ef

type = App\Notifications\PostLiked

notifiable_id= 48 

data = { "event":"LIKE",
         "postid":17,
         "sender":{
                   "id":50,
                   "name":"Developer",
                  }
       }

read_at = NULL

created_at = 2018-04-07 12:46:42

updated_at = 2018-04-07 12:46:42

теперь я хочу удалить строку уведомления базы данных по data->postid

Я попробовал запрос ниже:

DB::table('notifications')
    ->where('type','App\Notifications\PostLiked')
    ->where('data->postid',17)
    ->first();

получил ошибку:

QueryException SQLSTATE[42000]: синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MariaDB для правильного использования синтаксиса около '>'$."postid"' = 17) limit 1' в строке 1 (SQL: выберите * из уведомления, где (тип = App\Notifications\PostLiked и data->'$."postid"' = 17) limit 1)

Я также пытался выполнить следующий запрос:

$result=DB::table('уведомления')->whereRaw("JSON_EXTRACT(данные, '$.postid') = ?", [17]);

{
connection: { },
grammar: { },
processor: { },
bindings: {
select: [ ],
join: [ ],
where: [
17
],
having: [ ],
order: [ ],
union: [ ]
},
aggregate: null,
columns: null,
distinct: false,
from: "notifications",
joins: null,
wheres: [
{
type: "raw",
sql: "JSON_EXTRACT(`data`, '$.postid') = ?",
boolean: "and"
}
],
groups: null,
havings: null,
orders: null,
limit: null,
offset: null,
unions: null,
unionLimit: null,
unionOffset: null,
unionOrders: null,
lock: null,
operators: [
"=",
"<",
">",
"<=",
">=",
"<>",
"!=",
"<=>",
"like",
"like binary",
"not like",
"between",
"ilike",
"&",
"|",
"^",
"<<",
">>",
"rlike",
"regexp",
"not regexp",
"~",
"~*",
"!~",
"!~*",
"similar to",
"not similar to",
"not ilike",
"~~*",
"!~~*"
],
useWritePdo: false
}

пожалуйста, предложите мне правильный запрос для получения строки и удаления строки с помощью json (data.key) в таблице уведомлений

Источник
Ali
8 апреля 2018 в 10:17
0

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

Saurabh Mistry
8 апреля 2018 в 10:18
0

у меня ошибка в запросе

Jonas Staudenmeir
8 апреля 2018 в 13:09
0

Какая у вас ошибка?

Jonas Staudenmeir
8 апреля 2018 в 13:15
0

Является ли data столбцом JSON?

Saurabh Mistry
8 апреля 2018 в 16:58
0

да, данные представляют собой столбец json

Jonas Staudenmeir
8 апреля 2018 в 17:30
0

Какая у вас ошибка?

Saurabh Mistry
8 апреля 2018 в 18:45
0

@ Jonas Staudenmeir , вопрос обновлен, пожалуйста, посмотрите на ошибку

julianstark999
9 апреля 2018 в 05:26
1

Вы можете попробовать ->where('data', 'like', '%"postid":17%')

Rick James
28 апреля 2018 в 23:33
0

Какая версия MySQL/MariaDB?

Ответы (4)

avatar
Nazmul Hoque
26 сентября 2021 в 09:50
0

Да Можно удалить

1. Сначала вам нужно отправить postid в столбец данных таблицы уведомлений, например

   public function toArray($notifiable){
           return [
          'postid'=>$this->postid,
     ];
   }

2. Теперь посмотрите свою таблицу уведомлений, которую вы увидите

.
{"postid":post_id_value_here}

2. Примените следующий запрос, откуда вы хотите удалить

DB::table('notifications')->where('data->postid', $id)->delete();

Не забудьте использовать БД на вашем контроллере

avatar
Moaiz
16 апреля 2019 в 06:08
1

Мне помогло. Вы можете использовать этот запрос:

->where('data', 'like', '%\"postid\":17%' )->first();
avatar
Jonas Staudenmeir
9 апреля 2018 в 00:31
1

MariaDB не поддерживает эту запись для запросов столбцов JSON.

Вы можете использовать необработанный SQL:

->whereRaw("JSON_EXTRACT(`data`, '$.postid') = ?", [17])

Или установите этот пакет: https://github.com/ybr-nx/laravel-mariadb

Saurabh Mistry
9 апреля 2018 в 05:16
0

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

Jonas Staudenmeir
9 апреля 2018 в 12:41
0

Вам все равно придется звонить ->first()/->get()/->delete() в конце.

Jonas Staudenmeir
9 апреля 2018 в 13:15
0

Тот, у которого near '>'$."postid"' = 17?

Jonas Staudenmeir
9 апреля 2018 в 13:20
0

DB::table('notifications')->where('type','App\Notifications\PostLiked')->whereRaw("JSON_EXTRACT(data, '$.postid') = ?", [17])->first(); выдает такую ​​же ошибку?

Saurabh Mistry
9 апреля 2018 в 13:34
0

да . я пробовал ваш запрос с first() , get() но он дает ту же ошибку

Jonas Staudenmeir
9 апреля 2018 в 13:40
0

Давайте продолжим обсуждение в чате.

avatar
Mike Foxtech
8 апреля 2018 в 20:44
0
DB::table('notifications')
    ->where('type','App\Notifications\PostLiked')
    ->where('data->postid',17)
    ->first();

Я предполагаю, что ошибка здесь where('data->postid', 17). Просмотр где('имя_столбца_в_таблице', 'значение'); У вас не может быть имени поля в таблице data->posts