165 lines
4.7 KiB
PHP
165 lines
4.7 KiB
PHP
<?php
|
||
|
||
declare (strict_types=1);
|
||
|
||
namespace App\Model;
|
||
|
||
/**
|
||
* 聊天列表组数据表模型
|
||
*
|
||
* @property integer $id 聊天列表ID
|
||
* @property integer $talk_type 聊天类型[1:好友;2:群聊;]
|
||
* @property integer $user_id 用户ID或消息发送者ID
|
||
* @property integer $receiver_id 接收者ID[好友ID或群ID]
|
||
* @property integer $is_delete 是否删除
|
||
* @property integer $is_top 是否置顶
|
||
* @property integer $is_disturb 消息免打扰
|
||
* @property integer $is_robot 是否机器人
|
||
* @property string $created_at 创建时间
|
||
* @property string $updated_at 更新时间
|
||
* @package App\Model
|
||
*/
|
||
class TalkList extends BaseModel
|
||
{
|
||
protected $table = 'talk_list';
|
||
|
||
protected $fillable = [
|
||
'talk_type',
|
||
'user_id',
|
||
'receiver_id',
|
||
'is_delete',
|
||
'is_top',
|
||
'is_robot',
|
||
'is_disturb',
|
||
'created_at',
|
||
'updated_at'
|
||
];
|
||
|
||
protected $casts = [
|
||
'id' => 'integer',
|
||
'talk_type' => 'integer',
|
||
'user_id' => 'integer',
|
||
'receiver_id' => 'integer',
|
||
'is_delete' => 'integer',
|
||
'is_top' => 'integer',
|
||
'is_robot' => 'integer',
|
||
'is_disturb' => 'integer',
|
||
'created_at' => 'datetime',
|
||
'updated_at' => 'datetime'
|
||
];
|
||
|
||
/**
|
||
* 创建聊天列表记录
|
||
*
|
||
* @param int $user_id 用户ID
|
||
* @param int $receiver_id 接收者ID
|
||
* @param int $talk_type 创建类型[1:私聊;2:群聊;]
|
||
* @return array
|
||
*/
|
||
public static function addItem(int $user_id, int $receiver_id, int $talk_type)
|
||
{
|
||
$result = self::query()->where([
|
||
['user_id', '=', $user_id],
|
||
['talk_type', '=', $talk_type],
|
||
['receiver_id', '=', $receiver_id],
|
||
])->first();
|
||
|
||
if (!$result) {
|
||
$result = self::query()->create([
|
||
'talk_type' => $talk_type,
|
||
'user_id' => $user_id,
|
||
'receiver_id' => $receiver_id,
|
||
'created_at' => date('Y-m-d H:i:s'),
|
||
'updated_at' => date('Y-m-d H:i:s'),
|
||
]);
|
||
}
|
||
|
||
$result->is_top = 0;
|
||
$result->is_delete = 0;
|
||
$result->is_disturb = 0;
|
||
$result->updated_at = date('Y-m-d H:i:s');
|
||
$result->save();
|
||
|
||
return [
|
||
'id' => $result->id,
|
||
'talk_type' => $result->talk_type,
|
||
'receiver_id' => $result->receiver_id,
|
||
];
|
||
}
|
||
|
||
/**
|
||
* 聊天对话列表置顶操作
|
||
*
|
||
* @param int $user_id 用户ID
|
||
* @param int $list_id 对话列表ID
|
||
* @param bool $is_top 是否置顶(true:是 false:否)
|
||
* @return bool
|
||
*/
|
||
public static function topItem(int $user_id, int $list_id, $is_top = true)
|
||
{
|
||
return (bool)self::query()->where([
|
||
['id', '=', $list_id],
|
||
['user_id', '=', $user_id],
|
||
])->update([
|
||
'is_top' => $is_top ? 1 : 0,
|
||
'updated_at' => date('Y-m-d H:i:s')
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 删除聊天列表
|
||
*
|
||
* @param int $user_id 用户ID
|
||
* @param int $id 聊天列表ID、好友ID或群聊ID
|
||
* @param int $type ID类型[1:聊天列表ID;2:好友ID;3:群聊ID;]
|
||
* @return bool
|
||
*/
|
||
public static function delItem(int $user_id, int $id, $type = 1)
|
||
{
|
||
$model = self::query();
|
||
if ($type == 1) {
|
||
$model->where('id', $id)->where('user_id', $user_id);
|
||
} else {
|
||
$model->where([
|
||
['talk_type', '=', $type == 2 ? 1 : 2],
|
||
['user_id', '=', $user_id],
|
||
['receiver_id', '=', $id],
|
||
]);
|
||
}
|
||
|
||
return (bool)$model->update([
|
||
'is_delete' => 0,
|
||
'updated_at' => date('Y-m-d H:i:s')
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 设置消息免打扰
|
||
*
|
||
* @param int $user_id 用户ID
|
||
* @param int $receiver_id 接收者ID
|
||
* @param int $talk_type 接收者类型[1:好友;2:群组;]
|
||
* @param int $is_disturb 是否免打扰
|
||
* @return boolean
|
||
*/
|
||
public static function setNotDisturb(int $user_id, int $receiver_id, int $talk_type, int $is_disturb)
|
||
{
|
||
$result = self::query()
|
||
->where([
|
||
['user_id', '=', $user_id],
|
||
['talk_type', '=', $talk_type],
|
||
['receiver_id', '=', $receiver_id],
|
||
])
|
||
->first(['id', 'is_disturb']);
|
||
|
||
if (!$result || $is_disturb == $result->is_disturb) {
|
||
return false;
|
||
}
|
||
|
||
return (bool)self::query()->where('id', $result->id)->update([
|
||
'is_disturb' => $is_disturb,
|
||
'updated_at' => date('Y-m-d H:i:s')
|
||
]);
|
||
}
|
||
}
|