我已成功将Eloquent用作Slim Framework 2中的独立包。
但现在我想使用Illuminate \ Support \ Facades \ DB,因为我需要通过从2个表中获取信息并使用数据库中的Left Join和Counter来显示一些统计信息,如下所示:
use Illuminate\Support\Facades\DB;
$projectsbyarea = DB::table('projects AS p')
->select(DB::raw('DISTINCT a.area, COUNT(a.area) AS Quantity'))
->leftJoin('areas AS a','p.area_id','=','a.id')
->where('p.status','in_process')
->where('a.area','<>','NULL')
->orderBy('p.area_id');
我收到以下错误:
Type: RuntimeException
Message: A facade root has not been set.
File: ...\vendor\illuminate\support\Facades\Facade.php
Line: 206
我该如何解决?
到目前为止,我发现在this link中我需要创建一个新的app容器,然后将其绑定到Facade。但我还没有找到如何使其发挥作用。
这就是我开始其余Eloquent并正常工作的方式:
use Illuminate\Database\Capsule\Manager as Capsule;
$capsule = new Capsule();
$capsule->addConnection([
'my' => $app->config->get('settings'),
/* more settings ...*/
]);
/*booting Eloquent*/
$capsule->bootEloquent();
我该如何解决这个问题?
固定
正如@ user5972059所说,我必须在$capsule->setAsGlobal();//This is important to make work the DB (Capsule)
$capsule->bootEloquent();
然后,查询执行如下:
use Illuminate\Database\Capsule\Manager as Capsule;
$projectsbyarea = Capsule::table('projects AS p')
->select(DB::raw('DISTINCT a.area, COUNT(a.area) AS Quantity'))
->leftJoin('areas AS a','p.area_id','=','a.id')
->where('p.status','in_process')
->where('a.area','<>','NULL')
->orderBy('p.area_id')
->get();
答案 0 :(得分:41)
您必须将代码更改为:
$Capsule = new Capsule;
$Capsule->addConnection(config::get('database'));
$Capsule->setAsGlobal(); //this is important
$Capsule->bootEloquent();
在您的类文件的开头,您必须导入:
use Illuminate\Database\Capsule\Manager as DB;
答案 1 :(得分:14)
laravel 8 也有同样的问题。我替换了
use PHPUnit\Framework\TestCase;
与:
use Tests\TestCase;
答案 2 :(得分:7)
为什么有人标记答案没有用,它对我来说非常有效。我正在使用use Illuminate\Support\Facades\DB as DB;
,但在将胶囊设置为全局use Illuminate\Database\Capsule\Manager as DB;
之后,这可以$capsule->setAsGlobal();
。
答案 3 :(得分:6)
尝试uncommited app.php $ app-&gt; withFacades();
答案 4 :(得分:1)
运行后出现此错误:
$ php artisan config:cache
对我来说,解决方案是删除/bootstrap/cache/config.php
文件。我正在运行Laravel 5.5。
这种现象似乎在多种情况下发生,而不仅仅是外墙。
答案 5 :(得分:0)
如果您最近在Homestead&VirtualBox环境上升级了Laravel或找不到任何引起原因的原因,请确保您的Vagrant是最新的。
我让Taylor锁定了该线程。过去的几封答复都重申了该解决方案,即“升级到Virtualbox 6.x”,该线程已锁定,以防止在此处无关紧要的其他问题被解决。
答案 6 :(得分:0)
错误的方式
public function register()
{
$this->app->bind('Activity', function($app)
{
new Activity;
});
}
正确的方式?
public function register()
{
$this->app->bind('Activity', function($app)
{
return new Activity;
});
}
----------------------------------不要忘记返回
答案 7 :(得分:0)
在我的项目中,我在实例化对象时通过使用Laravel Dependency Injection解决了这个问题。以前我是这样的:
$class = new MyClass(
new Client(),
env('client_id', 'test'),
Config::get('myapp.client_secret')
);
当我使用Laravel env()和Config()时,发生了相同的错误消息。
我像这样在AppServiceProvider中介绍了Client和env:
$this->app->bind(
MyClass::class,
function () {
return new MyClass(
new Client(),
env('client_id', 'test')),
Config::get('myapp.client_secret')
);
}
然后实例化此类:
$class = app(MyClass::class);
答案 8 :(得分:0)
就我而言,所有外墙均不可用,包括任何工匠命令。
我尝试删除供应商并重新安装,但是问题仍然存在。
我终于找到了问题,因为我正在使用bensampo/laravel-enum
库,并且在配置文件中使用了类似于以下内容的语句,
'name' =>\App\Enums\VipLevelEnum::getDescription(
\App\Enums\VipLevelEnum::GOLD
)
这可能会导致由于Lang外观尚未加载而导致的错误(我想)
答案 9 :(得分:0)
您的错误可能是每件事。在Apache服务器上使用laravel时,可能看不到错误的详细信息。
你能尝试
php artisan serve --port=8080
了解更多详细错误。
答案 10 :(得分:0)
使用phpUnit测试laravel的一个随机问题是测试时尚未初始化laravel外观。
代替使用标准的PHPUnit TestCase类
class MyTestClass extends PHPUnit\Framework\TestCase
一个人可以使用
class UserTest extends Illuminate\Foundation\Testing\TestCase
这个问题就解决了。
答案 11 :(得分:0)
我在使用 PHPUnit v.9.5.4、PHP v.8.0.3 和 Lumen v. 8.2.2 运行测试时收到以下消息:
<块引用>PHP 致命错误: Uncaught RuntimeException: A Facade root has not 被设置。在 path_to_project/vendor/illuminate/support/Facades/Facade.php:258
尽管我显然已经将我的 app.php 配置为启用外墙 ($app->withFacades();
),但仍然发生了这种情况,但每当我尝试使用 {{1 }}。不幸的是,其他答案都没有帮助我。
这个错误实际上是由于我在 Illuminate\Support\Facades\DB
中的配置而引发的,它没有指向我的 app.php 文件,我实际启用了门面 >.
我只是不得不改变
phpunit.xml
到
<phpunit (...OTHER_PARAMS_HERE) bootstrap="vendor/autoload.php">
希望有帮助。
答案 12 :(得分:0)
升级php版本,调用接口时遇到这个错误
$ php artisan config:cache
删除/bootstrap/cache/config.php文件是一个非常有效的方法。