Laravel Eloquent - 如何定义这样的关系:Comment :: language() - > name

时间:2018-03-17 15:09:31

标签: php laravel eloquent

语言表包含:id,shortcode

评论表有id,user_id,comment,language_id(外键)

在评论模型中,我将语言定义为一个关系

在语言模型中,我将注释定义为hasMany关系(这是错误的?)。

在Tinker中,当我尝试执行时出现此错误:$ comment-> language() - > get():

#include <QApplication>
#include <QListWidget>
#include <QHBoxLayout>
#include <QScrollBar>

class Widget: public QWidget{
    Q_OBJECT
    QListWidget w1;
    QListWidget w2;

public:
    Widget(QWidget *parent=Q_NULLPTR):QWidget(parent){
        auto layout = new QHBoxLayout{this};
        layout->addWidget(&w1);
        layout->addWidget(&w2);

        connect(w1.verticalScrollBar(), &QScrollBar::valueChanged, [this](int value){
            w2.verticalScrollBar()->blockSignals(true);
            w2.verticalScrollBar()->setValue(value);
            w2.verticalScrollBar()->blockSignals(false);
        });
        connect(w2.verticalScrollBar(), &QScrollBar::valueChanged, [this](int value){
            w1.verticalScrollBar()->blockSignals(true);
            w1.verticalScrollBar()->setValue(value);
            w1.verticalScrollBar()->blockSignals(false);
        });

        for(int i=0; i<100; i++){
            w1.addItem(QString("item %1 of 1").arg(i));
            w2.addItem(QString("item %1 of 2").arg(i));
        }
    }


};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

#include "main.moc"

为什么Laravel在languages表中搜索comment_id?我似乎完全误解了一些事情。

获取语言短代码的正确方法是什么?我认为$ comment-&gt; language() - &gt; shortcode应该有用。

在不执行重复查询的情况下预加载所有language_id和短代码信息的最有效方法是什么,因为它被大量使用?

2 个答案:

答案 0 :(得分:1)

Laravel对你的关系中的关键字做出假设。因为您使用hasOne关系,所以Laravel希望密钥位于languages表中,名为comment_id。

您的评论模型应使用与语言的belongsTo关系并删除hasOne。这样,laravel假设外键实际上在注释表中,名为language_id,情况就是这样:)。

答案 1 :(得分:1)

使用belongsTo关系解决了这个问题。

之后我可以使用$ comment-&gt; language-&gt; shortcode;

访问它

谢谢大家!