如何在mooloquent / mongodb中使用望远镜?

时间:2018-12-12 06:00:12

标签: laravel laravel-5 telescope moloquent

显示错误

  

{消息:“对成员函数prepare()的调用为null”,…}异常:   “ Symfony \ Component \ Debug \ Exception \ FatalThrowableError”文件:   “ /var/www/html/broc/vendor/laravel/framework/src/Illuminate/Database/Connection.php”   行:326消息:“在null上调用成员函数prepare()”   跟踪:[,…]

2 个答案:

答案 0 :(得分:0)

首先,您需要调试使用的数据库是否正确。

文件:

vendor/laravel/telescope/src/Http/Controllers/EntryController.php
function : index()

dd($storage)  //show dump 

输出应为:

  

DatabaseEntriesRepository {#1671 #connection:“ mongodb”
  #monitoredTags:null}

之后

您需要扩展EntryModel vendor/laravel/telescope/src/Storage/DatabaseEntriesRepository.php

望远镜包的位置并在其中设置语音连接。

现在应该使用口语,而不是像这样使用的口才

//use Illuminate\Database\Eloquent\Model;

use Moloquent as Model;

class EntryModel extends Model

有关更多详细信息,请点击以下链接

https://thewebtier.com/php/complete-guide-for-implementing-laravel-telescope-with-mongodb/

答案 1 :(得分:0)

从提问之日起一年后,使用Laravel 6,选择的答案将不足。

需要两个步骤来解决此问题:

1-如@Yuvraj所述,更改Laravel\Telescope\Storage\EntryModel中的扩展模型:

//use Illuminate\Database\Eloquent\Model;

use Moloquent as Model;

class EntryModel extends Model

2-在同一类中是一个函数,用于根据请求中发送的选项来限定查询范围:

    public function scopeWithTelescopeOptions($query, $type, EntryQueryOptions $options)
    {
        $this->whereType($query, $type)
                ->whereBatchId($query, $options)
                ->whereTag($query, $options)
                ->whereFamilyHash($query, $options)
                ->whereBeforeSequence($query, $options)
                ->filter($query, $options);

        return $query;
    }

filter函数检查记录是否具有属性should_display_on_index设置为true,该属性在迁移中被设置为默认值: $table->boolean('should_display_on_index')->default(true); 但是由于使用了mongoDB,因此不遵守默认参数,因此不会将其添加到记录中。

要解决此问题,您有两个选择:

a)在前面提到的函数中注释掉要过滤的调用:

    public function scopeWithTelescopeOptions($query, $type, EntryQueryOptions $options)
    {
        $this->whereType($query, $type)
                ->whereBatchId($query, $options)
                ->whereTag($query, $options)
                ->whereFamilyHash($query, $options)
                ->whereBeforeSequence($query, $options)
                /*->filter($query, $options)*/;

        return $query;
    }

但是,如果以后要通过将should_display_on_index设置为false使用过滤器,则需要修改过滤器功能:

 protected function filter($query, EntryQueryOptions $options)
    {
        if ($options->familyHash || $options->tag || $options->batchId) {
            return $this;
        }

        // $query->where('should_display_on_index', true);
        $query->where('should_display_on_index', '!=', false);

        return $this;
    }