laravel5不能进行数据库的联合查询吗?显示Class not found in compiled.php
各位好,我这几天在跟着Raphael Saunier的《Getting Started with Laravel 4》学习Laravel,但我用的是Laravel 5,所以是自己边学边修改里面的例子,现在学习使用Eloquent的数据表联合查询时,遇到了Class not found in compiled.php的错误,使用的文件和错误描述具体如下(代码里的注释是我在这个帖子里添加的,在实际代码里没有):
这个例子是在数据库里面用两张表cats,breeds分别存储宠物猫信息以及猫血型分类信息,进行查询后显示出来
1. 路由文件
app/Http/routes.php
<?php
use App\Cat; //猫的模型
use App\Breed; //猫血型的模型
Route::get('test', function(){
$cat = Cat::first();//取cats数据表第一条记录,数据表创建文件在帖子后面贴出
//联合查询,使用$cat的breed_id字段从breeds表查找相应id的记录,并取出breeds表的name字段,就是这里出错的,如果只是$cat->name取出cats表自己的name字段是正常的
return view('test.index')->with('teststr', $cat->breed->name);
});
2. 视图文件
resources/views/test/index.php
<p>teststr is <?php echo $teststr; ?>
3. 模型Cat文件
app/Cat.php
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
use Breed;
class Cat extends Model {
//使得以下字段可以批量赋值
protected $fillable = array('name','date_of_birth','breed_id');
//与breeds表关联
public function breed(){
return $this->belongsTo('Breed');
}
}
4. 模型Breed文件
app/Breed.php
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
use Cat;
class Breed extends Model {
//breeds表不需要时间戳
public $timestamps = false;
//与cats表关联
public function cats(){
return $this->hasMany('Cat');
}
}
5. 数据表构建文件
database/migrations/2015_04_08_081726_add_cats_and_breeds_table.php
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddCatsAndBreedsTable extends Migration {
public function up()
{
//cats表有id,name,date_of_birth,breed_id,以及时间戳字段
Schema::create('cats', function($table){
$table->increments('id');
$table->string('name');
$table->date('date_of_birth');
$table->integer('breed_id')->nullable();
$table->timestamps();
});
//breeds表有id,name字段
Schema::create('breeds', function($table){
$table->increments('id');
$table->string('name');
});
}
public function down()
{
Schema::drop('cats');
Schema::drop('breeds');
}
}
6. 数据库(sqlite3)里面现有数据为:
cats表,共有一条记录如下,字段依次为id,name,date_of_birth,breed_id,created_at,updated_at
1|No.1CAT|2015-04-11 04:44:18|1|2015-04-11 04:44:18|2015-04-11 04:44:18
breeds表,共有四条记录如下,字段依次为id,name
1|Domestic
2|Persian
3|Siamese
4|Abyssinian
7. 具体错误为:
使用php artisan serve --host=0.0.0.0 -vvv启动服务器,然后访问/test/路径,页面显示“Whoops, looks like something went wrong.”,然后终端的记录里面显示
PHP Fatal error: Class 'Breed' not found in /root/workspace/cats/vendor/compiled.php on line 9509
我也测试了在routes.php中使用breeds表来联合查询cats表中的字段,这时终端里面就是Class 'Cat' not found in vendor/compiled.php了
我基本确定是在routes.php里的$cat->breed这个地方出错的,联合查询不是这样用的吗?
使用的php5.5.9, sqlite3.8.2, laravel 5.0.16
帖子比较长,是为了完整把相关代码贴上,实际上代码挺简单,希望各位能帮我看一下,谢谢了!
这个例子是在数据库里面用两张表cats,breeds分别存储宠物猫信息以及猫血型分类信息,进行查询后显示出来
1. 路由文件
app/Http/routes.php
<?php
use App\Cat; //猫的模型
use App\Breed; //猫血型的模型
Route::get('test', function(){
$cat = Cat::first();//取cats数据表第一条记录,数据表创建文件在帖子后面贴出
//联合查询,使用$cat的breed_id字段从breeds表查找相应id的记录,并取出breeds表的name字段,就是这里出错的,如果只是$cat->name取出cats表自己的name字段是正常的
return view('test.index')->with('teststr', $cat->breed->name);
});
2. 视图文件
resources/views/test/index.php
<p>teststr is <?php echo $teststr; ?>
3. 模型Cat文件
app/Cat.php
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
use Breed;
class Cat extends Model {
//使得以下字段可以批量赋值
protected $fillable = array('name','date_of_birth','breed_id');
//与breeds表关联
public function breed(){
return $this->belongsTo('Breed');
}
}
4. 模型Breed文件
app/Breed.php
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
use Cat;
class Breed extends Model {
//breeds表不需要时间戳
public $timestamps = false;
//与cats表关联
public function cats(){
return $this->hasMany('Cat');
}
}
5. 数据表构建文件
database/migrations/2015_04_08_081726_add_cats_and_breeds_table.php
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddCatsAndBreedsTable extends Migration {
public function up()
{
//cats表有id,name,date_of_birth,breed_id,以及时间戳字段
Schema::create('cats', function($table){
$table->increments('id');
$table->string('name');
$table->date('date_of_birth');
$table->integer('breed_id')->nullable();
$table->timestamps();
});
//breeds表有id,name字段
Schema::create('breeds', function($table){
$table->increments('id');
$table->string('name');
});
}
public function down()
{
Schema::drop('cats');
Schema::drop('breeds');
}
}
6. 数据库(sqlite3)里面现有数据为:
cats表,共有一条记录如下,字段依次为id,name,date_of_birth,breed_id,created_at,updated_at
1|No.1CAT|2015-04-11 04:44:18|1|2015-04-11 04:44:18|2015-04-11 04:44:18
breeds表,共有四条记录如下,字段依次为id,name
1|Domestic
2|Persian
3|Siamese
4|Abyssinian
7. 具体错误为:
使用php artisan serve --host=0.0.0.0 -vvv启动服务器,然后访问/test/路径,页面显示“Whoops, looks like something went wrong.”,然后终端的记录里面显示
PHP Fatal error: Class 'Breed' not found in /root/workspace/cats/vendor/compiled.php on line 9509
我也测试了在routes.php中使用breeds表来联合查询cats表中的字段,这时终端里面就是Class 'Cat' not found in vendor/compiled.php了
我基本确定是在routes.php里的$cat->breed这个地方出错的,联合查询不是这样用的吗?
使用的php5.5.9, sqlite3.8.2, laravel 5.0.16
帖子比较长,是为了完整把相关代码贴上,实际上代码挺简单,希望各位能帮我看一下,谢谢了!
3 个回复
Mr_Jing
赞同来自:
清除命令:
在生产环境中应该开启,以提升性能:
你现在是在开发调试,你就直接清除compiled.php吧
tuanzi
赞同来自:
你好,我把compiled文件清除了,但是服务器的终端还是会报错,具体错误为:
PHP Fatal error: Class 'Breed' not found in /root/workspace/cats/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 824
我打开这个文件看了下,前后的内容如下:
816 // If no foreign key was supplied, we can use a backtrace to guess the proper
817 // foreign key name by using the name of the relationship function, which
818 // when combined with an "_id" should conventionally match the columns.
819 if (is_null($foreignKey))
820 {
821 $foreignKey = snake_case($relation).'_id';
822 }
823
824 $instance = new $related;
825
826 // Once we have the foreign key names, we'll just create a new Eloquent query
tuanzi
赞同来自: