连接表时 Laravel 4 SQL 错误

Posted

技术标签:

【中文标题】连接表时 Laravel 4 SQL 错误【英文标题】:Laravel 4 SQL error when joining tables 【发布时间】:2014-04-29 08:19:24 【问题描述】:

我试图显示 1 条记录的亮点,服务和页面都加入到此表中以显示它们的详细信息(而不是只显示 service_idpage_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();

【讨论】:

谢谢!我已经这样做了,它没有给我一个错误,但是我现在如何从pageservice 获取数据?如果我打电话给$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 的问题

尝试创建表时 Oracle SQL “无效标识符错误”

尝试使用 Python 连接 DB2 上的表时出错 (SQL0332N)

如何从 Windows 命令提示符在 Laravel 中运行 PHPUnit

Laravel 路由问题:自动重定向到根文件夹