Laravel Artisan 控制台命令无法检索模型集合

Posted

技术标签:

【中文标题】Laravel Artisan 控制台命令无法检索模型集合【英文标题】:Laravel Artisan Console Command Cannot Retrieve Model Collection 【发布时间】:2017-03-30 21:39:21 【问题描述】:

我正在尝试通过使用 Artisan 创建的自定义控制台命令执行一些逻辑,但我无法使用我的模型类并使用 Eloquent 进行查询。

当我使用 MyModel::all() 时,它将返回集合中的所有记录。这很好,除了我使用的模型有太多记录无法将它们全部加载到内存中。

我正在尝试使用

  MyModel::where('id',$currentLoopId)->get();

这将返回一个空集合:(

我的控制台类如下:

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\ProcessReferral;
use App\TargetUrl;
use App\Website;

class ProcessReferrals extends Command

  /**
   * The name and signature of the console command.
   *
   * @var string
   */
  protected $signature = 'process:referrals';

  /**
   * The console command description.
   *
   * @var string
   */
  protected $description = 'Process all outstanding records in process_referrals table';

  protected $logArray = [];
  /**
   * Create a new command instance.
   *
   * @return void
   */
  public function __construct()
  
    parent::__construct();
  

  /**
   * Execute the console command.
   *
   * @return mixed
   */
  public function handle()
  
    $this->info('Start Processing Referrals');

    $process_referrals = ProcessReferral::all();        
    $referral_count = count($process_referrals);

    $this->info('Found '.$referral_count.' referral(s) that need processed');


    foreach($process_referrals as $referral)

        ## 1. SEE IF REFERRAL WEBSITE IS ACTIVE AND VERIFIED IN AFFILIATE_WEBSITES. LOAD LAST FORCE UPDATE REFRESH CODES
        ########################################

        $this->info('Processing Referral ID: '.$referral->id);
        $this->info('Get Website from Affiliate Website Id: '.$referral->affiliate_website_id);

        $websites = Website::where('id','=',$referral->affiliate_website_id)->get();
        dd($websites);

        ... ( more Logic after I get website )

    

我的模型类如下:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Website extends Model


    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'affiliate_websites';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        ...
    ];

    ... ( Eloquent Relations )
    

数据库表:

id  website_label   referrals
------------------------------
1   Google UK       920685
2   Google U.S.     2940884
3   Google Germany  709603

正在处理的第一个虚拟数据记录:

id  affiliate_website_id
-------------------------
2   3   

终端输出

$ php artisan process:referrals
Start Processing Referrals
Found 300 referral(s) that need processed
Processing Referral ID: 2
Get Website from Affiliate Website Id: 3
Website(id->62) is Active.
Illuminate\Database\Eloquent\Collection #901
  #items: []

我尝试了几种不同的查询方式,包括 DB::select(),它返回我正在寻找的内容,但我无法使用该约定动态设置我正在搜索的 id。

我的模型在我的应用程序的其他任何地方都可以使用,我认为存在某种命名空间问题,但我完全不知道为什么它不起作用。

任何帮助将不胜感激!

【问题讨论】:

在您上面的代码中,您在查询Website::where() 中缺少get() 是错字吗? 是的,这是一个错字 【参考方案1】:

正如@machuga 在http://laravel.io/chat 上指出的那样

我检查了我传递的 ID 是否是整数

  $website = Website::where('id',(int)$referral->affiliate_website_id)->first();

仍然有一些问题,但使用 ->first() 而不是 ->get() 来获取单个记录,因此我不必遍历网站集合

【讨论】:

以上是关于Laravel Artisan 控制台命令无法检索模型集合的主要内容,如果未能解决你的问题,请参考以下文章

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

Laravel 5.2:应用程序密钥的 Artisan 密钥生成无法正常工作

Laravel/Lumen - Artisan 控制台中缺少命令

通过 Laravel Artisan 控制台运行外部命令

Laravel 的Artisan 命令学习

如何使用 Artisan 命令 (PHP) 在 Laravel 5.2 中创建 RESTful 资源控制器