laravel 根据字段不同值做不同查询

在开发过程中我们经常遇到这种情况:

例如,一个信息表message,字段type 1.操作提醒 2.平台通知,表message_read记录当信息是平台通知时用户浏览状况

  那么 当信息是平台通知时是针对的所有用户,我们想根据他是否浏览状态去在消息提醒里去显示他未读的消息

语句如下(laravel)

    public function index()
    {
//        监听sql语句
//        DB::listen(function($query) {
//            $bindings = $query->bindings;
//            $sql = $query->sql;
//            foreach ($bindings as $replace){
//                $value = is_numeric($replace) ? $replace : "‘".$replace."‘";
//                $sql = preg_replace(‘/\?/‘, $value, $sql, 1);
//            }
//            dd($sql);
//        });
            $uid = 13;
            return MessageModel::where(function($query) use($uid){
                $query->where([‘type‘=>2,‘status‘=>1,])->whereNotIn(‘id‘,function($query) use($uid){
                    $query->select(‘mid‘)->from(‘message_read‘)->where([[‘message.id‘,‘=‘,DB::raw(‘mid‘)],‘uid‘=>$uid]);
                });
            })->orwhere(function($query) use($uid){
                $query->where([‘type‘=>1,‘status‘=>1,‘is_read‘=>2,‘uid‘=>$uid]);
            })->get();
    }

数据表格式

CREATE TABLE `message` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(11) DEFAULT NULL COMMENT ‘需要通知的用户id‘,
  `title` varchar(255) NOT NULL COMMENT ‘标题‘,
  `describe` varchar(255) DEFAULT NULL COMMENT ‘简介‘,
  `type` tinyint(4) DEFAULT NULL COMMENT ‘通知类型 1.行为通知 2.平台通知‘,
  `is_read` tinyint(4) DEFAULT NULL COMMENT ‘是否已读 1.已读 2.未读‘,
  `status` tinyint(4) DEFAULT ‘1‘ COMMENT ‘1存在 2删除‘,
  `created_at` int(11) DEFAULT NULL,
  `updated_at` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT=‘消息表‘;

CREATE TABLE `message_read` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(11) DEFAULT NULL COMMENT ‘用户id‘,
  `mid` int(11) DEFAULT NULL COMMENT ‘消息id‘,
  `created_at` int(11) DEFAULT NULL,
  `updated_at` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT=‘平台消息通知阅读记录表‘;

原文地址:https://www.cnblogs.com/houss/p/11470375.html

时间: 2024-11-06 09:28:15

laravel 根据字段不同值做不同查询的相关文章

[Elasticsearch] 关于字段重复值的常用查询和操作总结

1. 取得某个索引中某个字段中的所有出现过的值 这种操作类似于使用SQL的SELECT UNIQUE语句.当需要获取某个字段上的所有可用值时,可以使用terms聚合查询完成: GET /index_streets/_search?search_type=count { "aggs": { "street_values": { "terms": { "field": "name.raw", "siz

[转]Hibernate查询对象所有字段,单个字段 ,几个字段取值的问题

原文地址:http://www.ablanxue.com/prone_3552_1.html 1. 查询整个映射对象所有字段 Java代码 //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql = "from Users"; Query query = session.createQuery(hql); List<Users> users = query.list(); for(Users user : users){ System.

4、CRM2011编程实战——将窗体中指定控件的值做处理后更新到另一个字段中

需求:将接报时间加上到期提醒时间后得到的值,更新到字段"到期截止时间" Js调用: //设置到期截止时间 function setDeadLine(){ var recordId = Xrm.Page.data.entity.getId(); var entityName = Xrm.Page.data.entity.getEntityName(); var reportedTime = Xrm.Page.getControl("hxcs_fdatetimeofrequest

mssql查询某个值存在某个表里的哪个字段的值里面

第一步:创建 查询某个值存在某个表里的哪个字段的值里面 的存储过程 create proc spFind_Column_In_DB ( @type int,--类型:1为文字类型.2为数值类型 @str nvarchar(100)--需要搜索的名字 ) as --创建临时表存放结果 create table #tbl(PK int identity primary key ,tbl sysname,col sysname) declare @tbl nvarchar(300),@col sysn

treeview自动从表中添加标题和列值做目录的方法2

treeview自动从表中添加标题和列值做目录的方法2,该方法是借鉴万一老师的 http://www.cnblogs.com/del/archive/2008/05/15/1114450.html 首先界面上添加treeview组件,然后在treeview的onchange事件里这样写: 因为要用到定义个过程,需要在接口声明里引用 private { Private declarations } /// <summary> /// 刷新左侧treeView /// </summary&g

通过Java反射做实体查询

我们在使用hibernate的时候,查询的时候都会和实体中的一些字段相结合去查询,当然字段少了,还算是比较简单,当字段多了,就不那么容易了,所以就自己写了个方法,根据实体中的字段信息去查询,废话不多说上代码: /** * 根据实体查询,将所有的参数封装到实体中查询即可,不可查询为null的信息 * @param t * @return * @throws SecurityException * @throws NoSuchMethodException * @throws IllegalArgu

SQL 将一条记录中多个字段的值拼接为一个字段 &amp;&amp; 将多行数据合并成一行,并且拼接CONVERT() 、for xml path的使用

接着上篇文章的订单表(商品编号,价格设置时间id(类似于创建时间,创建时间约早,则act_id越小) ,价格的时间段,商品价格) 一.将一条记录中多个字段的值拼接为一个字段 现要求将两个时间段合并为一个字段,应该如何做呢? 先来看下理想的结果: 查询出的时间段合并到一起了: 代码如下,将查询的字段用+'你想要的符号' + 拼接即可 select item,act_id,loc_id,convert(varchar(100),start_date,20)+ '-' +convert(varchar

[DB][MySql]关于取得自增字段的值、及@@IDENTITY 与并发性问题

对于刚从Oracle转向MySql的人都会为,MySql中没有Oracle里的Sequence而感到困惑.MySql中没有了Sequence,那么MySql的主键用什么方式来实现最好呢? 主要有下面几种方式: 1.自增字段作为主键. [推荐方案] MySql尽管比Oracle少了Sequence,可是多了字段的自增长特性. 插入完了以后能够通过运行[SELECT @@IDENTITY]获取上一条插入语句中生成的自增长字段的值. 这个语句非常特别,没有关联到特定的SQL语句,会 让人感觉迷糊,他究

ajax基础语法、ajax做登录、ajax做用户名验证是否可用、ajax做关键字查询动态显示、ajax做用表格显示数据并增加操作列

AJAX: AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 如果此页面用到了ajax方法,一定要在页面上端加上: <script src="../../jquery-1.11.2.min.js"></script> ajax基础语法: <script type="text/javascript">