0

親の制約に基づいて行の ID を取得する必要があります。雄弁を使ってこれを行い、エレガントに保ちたいと思います。このプロセスの開始時に注意すべき点: 私は - country_code (2 桁の iso)、lang_code (言語の 2 桁の略語) が必要です - country_id、lang_id (主キー) を取得できるので - market_id (最後のクエリに必要)

必要なデータを次のように取得できます。変数の命名については申し訳ありません (クライアントは奇妙な名前を持っていました)。

// Only receive desired inputs
$input_get = Input::only('marketCode','langCode');

// Need the country based on the "marketCode"
$countryId = Country::where('code',$input_get['marketCode'])->pluck('id');

// Get the lang_id from "langCode"
$languageId = Language::where('lang_abbr',$input_get['langCode'])->pluck('lang_id');

// Get the market_id from country_id and lang_id
$marketId = Market::where('country_id', $countryId)
                  ->where('lang_id',$languageId)->pluck('market_id');

// Get All Market Translations for this market
$marketTranslation = MarketTranslation::where('market_id',$marketId)->lists('ml_val','ml_key');

私は次のことを試しましたが、これは制約に基づいて国と言語を熱心にロードするだけです。Eager Loading は、market_id が既にわかっている場合にのみ役立つようです。

class Market extends Eloquent {
    protected $primaryKey = 'market_id';

    public function country() {
        return $this->belongsTo('Country');
    }

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


$markets = Market::with(array(
    'country' => function($query){
        $query->where('code','EE');
    },
    'language'=> function($query){
        $query->where('lang_abbr','et');
    }
))->get();
4

2 に答える 2

0

そのため、関係を調べた後、手動の結合やクエリを使用せずに、ORM で定義された関係だけを使用して機能させることができました。熱心な読み込みを使用し、コレクションに必要なデータをフィルタリングするという点で、それは正しいようです。

    // Get A country object that contains a collection of all markets that  use this country code
    $country = Country::getCountryByCountryCode('EE');

    // Filter out the market in the collection that uses the language specified by langCode
    $market = $country->markets->filter(function($market) {
        if ($market->language->lang_abbr == 'et') {
            return $market;
        }
    });

    // Get the market_id from the market object
    $marketId = $market->first()->market_id;

モデルと関係は次のようになります。

class Country extends Eloquent {

    public function markets() {
        return $this->hasMany('Market')->with('language');
    }

    public static function getCountryByCountryCode($countryCode)
    {
        return Country::with('markets')->where('code',$countryCode)->first();
    }
}

class Market extends Eloquent {
    protected $primaryKey = 'market_id';

    public function country() {
        return $this->belongsTo('Country');
    }

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

}



class Language extends Eloquent {

    protected $primaryKey = 'lang_id';

}
于 2013-05-01T23:56:24.577 に答える