如何将 telescope 与 moloquent / mongodb 一起使用?
How to use telescope with moloquent / mongodb?
显示错误
{message: "Call to a member function prepare() on null",…} exception:
"Symfony\Component\Debug\Exception\FatalThrowableError" file:
"/var/www/html/broc/vendor/laravel/framework/src/Illuminate/Database/Connection.php"
line: 326 message: "Call to a member function prepare() on null"
trace: [,…]
首先您需要调试您使用的是正确的数据库。
文件:
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
telescope 包的位置并在那里设置 moloquent 连接。
现在应该使用 Moloquent 而不是像那样使用 Eloquent
//use Illuminate\Database\Eloquent\Model;
use Moloquent as Model;
class EntryModel extends Model
更多详情请见下文link
https://thewebtier.com/php/complete-guide-for-implementing-laravel-telescope-with-mongodb/
从问题日期算起一年后,Laravel 6,选择的答案将不够。
需要 2 个步骤来解决问题:
1- 正如@Yuvraj 提到的那样,更改 Laravel\Telescope\Storage\EntryModel
中的扩展模型:
//use Illuminate\Database\Eloquent\Model;
use Moloquent as Model;
class EntryModel extends Model
2- 在同一个 class 中是一个函数,它通过请求中发送的选项来限定查询范围:
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) 注释掉前面提到的函数中对filter的调用:
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;
}
显示错误
{message: "Call to a member function prepare() on null",…} exception: "Symfony\Component\Debug\Exception\FatalThrowableError" file: "/var/www/html/broc/vendor/laravel/framework/src/Illuminate/Database/Connection.php" line: 326 message: "Call to a member function prepare() on null" trace: [,…]
首先您需要调试您使用的是正确的数据库。
文件:
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
telescope 包的位置并在那里设置 moloquent 连接。
现在应该使用 Moloquent 而不是像那样使用 Eloquent
//use Illuminate\Database\Eloquent\Model;
use Moloquent as Model;
class EntryModel extends Model
更多详情请见下文link
https://thewebtier.com/php/complete-guide-for-implementing-laravel-telescope-with-mongodb/
从问题日期算起一年后,Laravel 6,选择的答案将不够。
需要 2 个步骤来解决问题:
1- 正如@Yuvraj 提到的那样,更改 Laravel\Telescope\Storage\EntryModel
中的扩展模型:
//use Illuminate\Database\Eloquent\Model;
use Moloquent as Model;
class EntryModel extends Model
2- 在同一个 class 中是一个函数,它通过请求中发送的选项来限定查询范围:
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) 注释掉前面提到的函数中对filter的调用:
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;
}