【问题标题】:Retrive data based on pivot table in laravel在 laravel 中根据数据透视表检索数据
【发布时间】:2015-01-27 20:11:02
【问题描述】:

我的数据库中有这些表

翻译

  1. 身份证
  2. translation_key_id
  3. 内容

语言

  1. 身份证
  2. 代码(可能是“eng”或“ger”或“fre”)

翻译语言

  1. 身份证
  2. translation_id
  3. language_id

现在模型是

class Language extends Eloquent {

    protected $fillable = array('id','code');
    protected $table = 'language';

    private $rules = array();

    public function translation()
    {
        return $this->belongsToMany('translation','language_translation');
    }
}


class Translation extends Eloquent {

    protected $fillable = array();
    protected $table = 'translation';

    private $rules = array();

    public function language()
    {
        return $this->belongsToMany('language','language_translation');
    }
}

现在我想检索那些具有transkation_key_id = abc(例如)和code = "eng"的数据

我该怎么做?

【问题讨论】:

  • 您要检索哪个模型?
  • 我需要由 translation_key_id 用英文写的内容

标签: database laravel-4 pivot eloquent


【解决方案1】:

首先,我认为这里不需要数据透视表。

告诉我你为什么需要它,或者改变你与belongsTo的关系。您可以使用id (1) 或code (2) 将翻译与语言联系起来,这显然是独一无二的,对吧?就这样吧:

table translations: id, key, content, language_id (or language_code)

// Translation
public function language()
{
  // option 1
  return $this->belongsTo('Lanugage');
  // or 2:
  // return $this->belongsTo('Lanugage', 'language_code', 'code');
}t

然后

// option 1
Translation::where('key', 'whatever')->whereHas('language', function ($q) {
   $q->where('code', 'eng');
})->first();

// option 2, even easier w/o any join needed
Translation::where('key', 'whatever')->where('language_code', 'eng')->first();

【讨论】:

  • 这里的数据透视表仅用于创建翻译和语言之间的多对多关系
  • 我完全不明白。为什么你需要 m-m,而它是 1-m?
  • 其实这里很多内容被翻译成多种语言。所以1个内容被翻译成多种语言,许多翻译可能有相同的语言翻译。这就是背后的逻辑。是不是正确的???
  • 你能解释一下你写的查询,以便我可以将它用于我的其他目的吗??
  • 查看文档。 whereHas 向查询添加连接和约束,因此它只返回那些具有匹配给定条件的相关行的parent 模型。现在,关于设计——内容真的与多种语言相关联吗?如何?我猜keyx -> 'some translated text' 只适用于一种语言。
【解决方案2】:

你建立的关系不正确

试试这个

    class Language extends Eloquent {

    protected $fillable = array('id','code');
    protected $table = 'language';

    private $rules = array();

    public function translation()
    {
        return $this->belongsToMany('Translation','translation_language');
    }
}

class Translation extends Eloquent {

    protected $fillable = array();
    protected $table = 'translation';

    private $rules = array();

    public function language()
    {
        return $this->belongsToMany('Language','translation_language');
    }
}

【讨论】:

  • 实际上我需要为此目的我应该写什么查询
猜你喜欢
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2020-04-06
  • 2018-04-10
  • 2015-09-02
相关资源
最近更新 更多