2013-05-01 4 views
0

Мне нужно получить идентификатор строки, основанный на ограничениях родителей. Я хотел бы сделать это с помощью красноречивого и сохранить его элегантно. Некоторые вещи, которые следует учитывать при запуске этого процесса: У меня есть - country_code (2 цифры iso), lang_code (2-разрядная аббревиатура для языка) Мне нужно - country_id, lang_id (первичные ключи) , так что я могу получить - market_id (необходимо для последнего запрос)Laravel 4 eloquent - Получение идентификатора себя, основанного на ограничениях родителей

Я могу получить данные, мне нужно с нижеследующим, извините за именование переменных (клиент имел странные имена):

// 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'); 

Я попытался следующий, но это только стремятся загружать страну и язык на основе ограничений. Желание Загрузка только кажется полезным, если 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(); 

ответ

1

Для этого вам нужно будет использовать соединения.

$market = Market::join('countries', 'countries.id', '=', 'markets.country_id') 
    ->join('languages', 'languages.id', '=', 'markets.language_id') 
    ->where('countries.code', '=', 'EE') 
    ->where('languages.lang_abbr', 'et') 
    ->first(); 

echo $market->id; 

Если это часто случается, то, вероятно, я бы добавил статический метод к модели рынка.

// in class Market 
public static function lookup_id($country_code, $language_abbreviation) { ... } 

// then later 
$market_id = Market::lookup_id('EE', 'et'); 
+0

Спасибо за ваш ответ. Я изучил этот вариант, но мне очень хотелось не выполнять ручные объединения или запросы. Я действительно хотел полагаться на отношения и ORM. Я опубликовал решение, которое я придумал. –

0

Таким образом, после глядя на отношения, я был в состоянии заставить его работать без использования инструкции присоединяется или запросы, только отношения, определенные в ОРМ. Кажется правильным, поскольку он использует загрузку и фильтрует данные, необходимые в коллекции.

// 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'; 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^