PHP模型关联一对多如何给关联表加条件?

我要拿出当前用户的通知列表(包括用户是否查看的状态,状态是在另一张表的,如果notice_record 存在 user——id的话,代表是已经阅读了)表结构如下

图片描述

图片描述

下面是我的代码

<?php
namespace appindexmodel;
use thinkModel;
class Notice extends Model
{

public function record()
{
    return $this->hasMany('NoticeRecord','notice_id');
}

}

//查询当前用户的通知列表(假设当前的用户id=100)
$list = Notice::hasWhere('record',['user_id'=>100])->select();

这样查出来的结果和我想象中的不一样,没有过滤掉 notice_record表中不属于 user_id=100的数据。是官方的BUG还是我使用出错了,我尝试$list = Notice::hasWhere('record',['user_id'=>100])->select();里面的user_id故意写错user_ids,报错说notice_record表没有这个字段,那么证明我的思路是对的,为什么结果和我想象的不一样,我很郁闷

阅读 5.9k
1 个回答

首先回答第一个问题

你要求的是 在 notice 表中存在,检索的时候 排除notice表中有的数据

你可以这样做,不需要模型关联

首先,取出 notice 表中的数据,只需要取出 user_id 字段的数据

public function getData(Notice $notic , User $user)
{

    $userIds = $notic->all()->pluck('user_id')->toArray();

    $users = $user->query()->whereNotIn('id' , $userIds)->get();

    dd( $users);
}
pluck 方法为给定键获取所有集合值 , 在通过 查询语句,使用 whereNotIn的 方式 查询数据

第二个问题 查询当前用户的通知列表

不是通过自增 id 来查询,前 100 条数据,

如果是使用 sql 语句查询 , 则使用 limit 0,100

使用laravel的话,则有一个take方法, 例如take(100)

hasWhere laravel 中好像没有这个方法噢
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题