Laravel 5.3 Eloquent 关系

Laravel 5.3 Eloquent Relationships

我正在使用 Laravel 5.3

我正在尝试从数据库中 select 语言文件的值,

我创建了一个文件并将其命名为global.php

在文件中我尝试这样做:

use App\Dictionary;

$language_id = 1;

$dictionary = array();
$lables     = Dictionary::where('language_id',$language_id)->get();
foreach($lables as $label):
    $dictionary[$label->label] = $label->value;
endforeach;

return $dictionary;

现在,这是可行的,但我想 select 使用 short_name 字段的行,而不是语言的 id

我希望它是这样的:

$lables     = Dictionary::all()->language()->where('short_name', 'en')->get();

我的数据库是这样的:

语言

id
name // for example: English
short_name // for exmaple: en

词典

id
key
value
language_id

我的模型是这样的:

语言模型

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Language extends Model
{
    use SoftDeletes;
    protected $softDelete = true;
    protected $dates = ['deleted_at'];

    public function dictionary()
    {
        return $this->hasMany('App\Dictionary');
    }
}

词典模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Dictionary extends Model
{
    protected $table = 'dictionary';

    public function language()
    {
        return $this->belongsTo('App\Language');
    }

}

感谢您的帮助!

!!!更新!!!

我又加了 1 个 table 叫

标签

id
label_name

并将字典 table 更改为:

词典

id
lable_id
value
language_id

我怎样才能做到这一点,这样我就可以拉 label_name 而不是 label_id

$lables = Dictionary::whereHas('language', function($query) {
    $short_name = basename(__DIR__);
    $query->where('short_name', $short_name);
})->pluck('value', 'label_id')->toArray();

我猜它可能是这样的:

$lables     = Dictionary::with('language')->where('short_name', 'en')->get();

您可以将 Laravel 的 whereHas() 函数用作:

$lables = Dictionary::whereHas('language', function($query) {
    $query->where('short_name', 'en');
})->get();

更新

如果你想摆脱你的 foreach() 那么你可以使用 Laravel 的 pluck() 函数作为:

$lables = Dictionary::whereHas('language', function($query) {
    $query->where('short_name', 'en');
})->pluck('value', 'label')->toArray();