连接表时 Laravel 4 SQL 错误
Posted
技术标签:
【中文标题】连接表时 Laravel 4 SQL 错误【英文标题】:Laravel 4 SQL error when joining tables 【发布时间】:2014-04-29 08:19:24 【问题描述】:我试图显示 1 条记录的亮点,服务和页面都加入到此表中以显示它们的详细信息(而不是只显示 service_id
和 page_id
)
在我的 HighlightsController 中,我有以下内容可以从我的数据库中获取项目:
$highlight = Highlight::where('id', $id)->with(array('Service','Page'))->get();
我收到此错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'services.highlight_id' in 'where clause' (SQL: select * from `services` where `services`.`highlight_id` in (1))
我知道该列不存在,因为它在错误的表中查找。我不知道我做错了什么。我一遍又一遍地把我的模型与我的 SQL 进行比较,并思考我哪里出错了
以下是所有可能有用的细节:
我想得到的 SQL:
SELECT * FROM highlights
LEFT JOIN pages ON pages.id = highlights.page_id
LEFT JOIN services ON services.id = highlights.service_id
WHERE highlights.id = '1'
我的桌子:
亮点
+------------+
| Field |
+------------+
| id |
| service_id |
| page_id |
| text |
+------------+
服务
+------------+
| Field |
+------------+
| id |
| title |
| description|
+------------+
页面
+------------+
| Field |
+------------+
| id |
| name |
+------------+
模型及其功能:
class Highlight extends Eloquent
function Service()
return $this->HasMany('Service');
function Page()
return $this->HasMany('Page');
class Service extends Eloquent
function Highlight()
return $this->HasMany('Highlight');
class Service extends Eloquent
function Highlight()
return $this->belongsTo('Highlight');
【问题讨论】:
【参考方案1】:为了清楚起见 - 急切加载(with()
方法)不会加入任何内容,而是使用 WHERE id IN
子句为每个加载的关系运行另一个查询。
改变那些完全不正确的关系:
// Let's call methods snakeCased just for clarity and sticking to the convention
// and singular or plural depending on what is returned
class Highlight extends Eloquent
function service()
return $this->belongsTo('Service'); // returns single Model
function page()
return $this->belongsTo('Page'); // same as above
class Service extends Eloquent
function highlights()
return $this->HasMany('Highlight'); // returns Collection of Models
// you can have hasOne instead, depending on your app
class Service extends Eloquent
function highlights()
return $this->hasMany('Highlight'); // again Collection
那你叫它:
// returns Collection, so let's call it plural:
$highlights = Highlight::where('id', $id)->with(array('service','page'))->get();
【讨论】:
谢谢!我已经这样做了,它没有给我一个错误,但是我现在如何从page
或service
获取数据?如果我打电话给$highlights->page
它不起作用,$highlights->name
也不起作用。
Nvm 我改变了我的电话,它现在可以工作了:) $highlight = Highlight::with(array('service','page'))->find($id);
find()
和get()
的区别再次是它返回的内容 - 首先是单个模型,后者是集合,因此您需要在 foreach 循环中使用它。跨度>
以上是关于连接表时 Laravel 4 SQL 错误的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 和 Postgresql 带有消息“找不到驱动程序”错误的 PDOException
php artisan migrate-laravel 的问题
尝试使用 Python 连接 DB2 上的表时出错 (SQL0332N)