0

我正在为 OctoberCMS 开发一个报告小部件,并且需要为我的查询构建一些条件语句。

我有一个表 (user_access_log),其中包含用户 ID、IP 地址和时间戳的记录。

我的访问日志模型是这样的:

/**
 * @var array
 */
 public $belongsTo = [
    'user' => ['Models\User']
 ];

我的用户模型是这样的:

/**
 * @var array Relations
 */
public $belongsToMany = [
    'groups' => ['Models\UserGroup', 'table' => 'users_groups']
];

更新:现在我已经像这样扩展了用户模型:

UserModel::extend(function($model)
{
    $model->hasMany['logs'] = [
        'Models\AccessLog',
        'key' => 'user_id',
    ];
});

并将我的小部件的查询更新为:

$query = UserGroup::whereHas('user',function($query) {
    $query->whereHas('logs',function($query) {
        // Just some query to get a resultset back so count() > 1
        $query->whereNotNull('created_at');
    });
 });

$userLog = $query->where('name', 'Users')->get();

但是,我仍然没有返回任何结果。实际上,就好像查询甚至没有运行一样。我的调试栏中没有显示任何内容。我试图将数组传递给我的视图,它现在说我有一个未定义的变量。

4

2 回答 2

0

我认为您必须在调用之前进行查询,all()因为此时您将获得 Eloquent Collection 而没有查询生成器

$log = AccessLog::whereHas('user', function($q){
     $q->whereHas('groups', function($subquery){
      $subquery->where('name', '=', 'staff');
     }
})->get()->groupBy('user_id');

这可能有效:D

于 2017-08-16T21:23:02.097 回答
0

回顾一下你所拥有的:

属于 ONE 用户的访问日志条目。
属于许多组的用户。
属于许多用户的组。

您想要的是查看哪些组来自所有访问日志。

您需要在用户中实现 hasMany 关系。

$hasMany = [
      'logs' => [
         'Models\AccessLog', 
         'key'=> 'user_id'
       ],
];

然后你可以建立一个查询,如:

$query = UserGroup::whereHas('user',function($query) {
   $query->whereHas('logs',function($query) {
       // Just some query to get a resultset back so count() > 1
       $query->whereNotNull('created_at');
   });
});
$staff = $query->where('name','staff')->get();
于 2017-08-22T10:59:52.753 回答