如何将 Laravel 命令中的内容读入我的控制器

Posted

技术标签:

【中文标题】如何将 Laravel 命令中的内容读入我的控制器【英文标题】:how can I read something from Laravel command into my controller 【发布时间】:2021-11-03 00:45:04 【问题描述】:

感谢告知,我创建了一个新的 laravel 命令,该命令会定期通过 schedule 函数运行。

在句柄函数中,我每天都在执行这个查询,我希望能够在我的控制器的 get 方法中检索变量主题。那么执行此操作的最佳方法是什么?

 public function handle()
    
        $topics = DB::table("sentences")
            ->select("topic")
            ->OrderByRaw("RAND()")
            ->distinct()
            ->limit(5)
            ->get();
        echo($topics);    
        return 0;
    

【问题讨论】:

【参考方案1】:

您在此处执行的命令与您的控制器之间没有链接。

没有办法在控制器中“检索”$topics 变量,它们在您的应用程序中是完全不同的实体。

我的猜测是您正在尝试缓存这些数据,以便您可以快速获取它们,而不会出现任何性能问题。

如果是这种情况,那么你很幸运,因为解决方案非常简单。

    public function handle()
    
        Cache::put('topics', function()
           return DB::table("sentences")
              ->select("topic")
              ->OrderByRaw("RAND()")
              ->distinct()
              ->limit(5)
              ->get();
        );
  
        return 0;
    

然后,在您的应用程序的任何地方,您都可以通过以下方式检索主题:

$topics = Cache::get('topics');

这是一个基本示例,但它应该可以工作。但是,如果缓存不存在,Cache::get('topics') 将返回null

您可以通过检索主题来解决此问题:

$topics = Cache::rememberForever('topics', function()
           return DB::table("sentences")
              ->select("topic")
              ->OrderByRaw("RAND()")
              ->distinct()
              ->limit(5)
              ->get();
        );

// this way, if the cache doesn't exist, it'll be created.
// then your scheduled command will update it every day

【讨论】:

我更新了我的答案,因为代码有一些错误。【参考方案2】:
$topics = DB::table("sentences")
            ->select("topic")
            ->OrderByRaw("RAND()")
            ->distinct()
            ->limit(5)
            ->pluck('id');  //pass only the array if ids
if($topics) 
  return redirect()->route('route.name.to.controller',['topics' => $topics]);
else
   // do another action

【讨论】:

以上是关于如何将 Laravel 命令中的内容读入我的控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件的内容读入C中的字符串?

如何将文件内容读入 istringstream?

Laravel 5 - 如何从 Artisan 命令运行控制器方法?

如何将数组从 Laravel Blade 传递到 Laravel 6/Vue 2.6 中的 Vue 组件。*

如何将数据从控制器传递到 Laravel 中的视图

如何使用laravel中的控制器将多个变量传递给视图