Laravel 4:多个列上的一对多?

Laravel 4:多个列上的一对多?,laravel,relational-database,Laravel,Relational Database,我正在制作一个表,它将一个表中的行映射到另一个表中的行,其中的结构如下: |--- Words --| |- Synonyms -| |------------| |------------| | id | | id | | en | | word_id | | ko | | synonym_id | | created_at | | created_at | | updated_at | | up

我正在制作一个表,它将一个表中的行映射到另一个表中的行,其中的结构如下:

|--- Words --|   |- Synonyms -|
|------------|   |------------|
| id         |   | id         |
| en         |   | word_id    |
| ko         |   | synonym_id |
| created_at |   | created_at |
| updated_at |   | updated_at |
|------------|   |------------|
现在,我知道我基本上可以通过如下函数使
单词
模型具有许多
同义词

public function synonyms()
{
    return $this->hasMany('Synonym');
}
没问题,但是这个方法总是通过
word\u id
来获取它,我想从
word\u id
同义词\u id
来获取它,这样我就不必在数据库中创建多个条目


还有什么我可以做的吗

检查laravel文档中的雄辩关系。它只能得到word_id,因为我相信这是唯一的外键


还有,为什么同义词表中有同义词id?

我相信您正在寻找多态关系


我认为您最好的选择是使用
同义词表作为透视表,与
单词本身建立多对多关系

将此添加到您的
Word
模型中

public function synonyms()
{
    return $this->belongsToMany('Word', 'synonyms', 'user_id', 'synonym_id');
}
使用它:

$word = Word::where('en', '=', 'someword')->first();
foreach($word->synonyms as $synonym) {
    // This method would probably return the same word as a synonym of itself so we can skip that iteration.
    if($synonym->en == $word->en) {
        continue;
    }
    // Echo the synonym.
    echo $synonym->en;
}

我对你想通过
word\u id
synonym\u id
查找同义词感到有点困惑,但我认为如果你使用多对多,那没关系,因为如果你知道同义词,从技术上讲它仍然只是一个词,你会做完全相同的事情。

我知道它只会得到单词\u id,我希望两者都能得到。我有一个同义词,因为它表明哪个词是另一个词的同义词。例如,Photo(id 1)和Photo(id 100),所以这一行类似于id:1,word_id:1,synonym_id:100,但因此我们知道Photo是Photo的同义词,我希望避免生成额外的行,id:2,word_id:100,synonym_id:1,我的表可能走错路了吗?我理解多态是指很多表上的关系,这适用于同一个表上的多个列,它的工作方式是否相同?另外,如果你觉得有更好的方法来做这张桌子,我并不反对改变它。我现在不在一个可以测试它的地方,但它看起来很有希望。我想使用任一列的原因是,假设我已经决定photo(1)有一个同义词picture(57)。现在,该行类似于(id:3,单词_id:1,同义词_id:57),但这也意味着picture的同义词是photo。所以,如果我想让它只使用word_id工作,我就必须一直排第二行。有更好的方法吗?