2014-02-06 2 views
1

может кто-нибудь помочь мне по следующему запросу.Запрос на реляционную базу данных Laravel 4

У меня есть таблица, которая содержит столбец почтового индекса и столбца рейтинга, т.е.

ID | POSTCODE | RATING 
1 | sk101dd | E 
2 | sk101de | A 
3 | sk101df | E 
4 | sk101dg | E 
5 | sk101dh | D  
etc 

Это устанавливается как модель называется PostcodeList

У меня есть реляционная таблица, связанная через колонку РЕЙТИНГА, который содержит идентификатор клиента и стоимость, то есть.

ID | CUSTOMER_ID | RATING | COST 
1 | 1234  | E | 0.05 
2 | 9999  | E | 0.02 

Это настраиваемая модель под названием RatingCost. Я связал это с моделью PostcodeList, используя следующий код:

public function costing() 
{ 
    return $this->hasMany('PostcodeList','RATING','RATING'); 
} 

мне нужно вернуть COST от модели RatingCost с использованием CUSTOMER_ID в качестве фильтра, не прибегая к нескольким SQL заявления. Я думаю, что я чуть не получил его, используя код, приведенный ниже, но это не совсем верно:

$p = PostcodeList::where('postcode',$somepostcode)->first(); 

$cost = $p->costing()->where('customer_id',$somecustomerid)->first()->cost; 

Ошибка я получаю в данный момент «Попытка получить свойство не-объекта».

Любая помощь очень ценится. Я не хочу прибегать к DBRAW или другой форме присоединения, поскольку мне очень нравится реляционная настройка Laravel.

благодаря

+0

Похоже, вы получаете сообщение об ошибке, потому что почтовый индекс не имеет столбец customer_id. Вы также должны отметить это как php –

+1

Спасибо за ответ. В таблице почтовых индексов не хранится идентификатор клиента, только в таблице RatingCost указано, что будет несколько идентификаторов клиента, связанных с одним и тем же рейтингом, но с разными затратами. Поэтому я, вероятно, объясню это неправильно Laravel, но не могу понять правильный код. – james

+0

Это имеет смысл. Итак, почему вы повторяете список почтовых индексов, чтобы соответствовать идентификатору клиента?Я не знаком с DBRAW, но laravel действительно реализует свои собственные соединения здесь: http://laravel.com/docs/queries#joins –

ответ

1

Я знаю, что вы пытаетесь держаться подальше от соединений, но этот запрос Laravel будет производить желаемые результаты:

DB::table('PostcodeList') 
      ->join('RatingCost', function($join) 
      { 
       $join->on('RATING', '=', 'RatingCost.RATING') 
        ->->where('customer_id',$somecustomerid) 
      }) 
+0

Спасибо, да, это был мой план резервного копирования, и тот, на который я поеду, если я не смогу это понять. Но я бы хотел, чтобы бит hasMany работал, если это было возможно. – james

+0

Возможно ли, что ошибка связана с локальным ключом и внешним ключом, который называется «RATING»? –

+0

Фактический код не использует те же ключевые имена, которые я использовал здесь, я внес поправки для ясности. Но спасибо за ответ. – james

1

Вы это

$postcode_get = PostcodeList::where('postcode',$somepostcode)->get(); 
foreach($postcode_get as $p){ 
    ... 
    $cost = $p->costing()->where('customer_id',$somecustomerid) 
    // ... 
} 

У вас есть определил метод costing в вашей модели RatingCost, но назовите его с модели PostcodeList, в этом случае вам нужно объявить отношение внутри ваша PostcodeList модели, как это:

public function costing() 
{ 
    // change the field name 'RATING' in any table, maybe 
    // prefix with table name or something else, keep different 
    return $this->belongsToMany('RatingCost','RATING', 'RATING'); 
} 

Таким образом, вы можете использовать эту функцию (внутри цикла):

$cost = $p->costing(); 

Потому что, внутри вашей loop каждого $p представляет PostcodeList модели и $postcode_get представляет собой набор PostcodeList моделей ,

+0

Спасибо за ответ. Я изначально использовал «принадлежит» точно так же, как вы заявили там. Однако может быть несколько затрат в зависимости от customer_id, то есть клиент с идентификаторами типа 1234 в postcode «sk101dd», и он возвращает оценку E со стоимостью 0,05, однако клиент с типами идентификаторов 9999 в почтовом индексе «sk101dd» и возвращает рейтинг E со стоимостью 0,02 , Правильно ли я думаю, что для этого потребуется «hasMany», а не «принадлежит»? – james

+0

Он должен быть тогда 'ownToMany' вместо' ownTo', если я получу вашу точку. –

+0

@james, Проверьте обновленный ответ. –

0

Я не думаю, что то, что я пытаюсь сделать, на самом деле возможно без использования объединений. Таким образом, решение было скрапа belongsTo и hasMany варианты стандартного присоединиться (по аналогии с ответом dev_feed в):

$pr = PostcodeList::join('RatingCost', function($join) 
     { 
     $join->on('PostcodeList.content_rate', '=', 'RatingCost.code'); 
     }) 
     ->where('postcode', '=', $somepostcode) 
     ->where('RatingCost.customer_id','=',$somecustomerid) 
     ->first(); 
+0

рад, что вы это поняли. пожалуйста, примите свой ответ, чтобы, когда другие рассматривают вопрос, они видят ваш ответ наверху –

+0

Да, как я могу установить ответ? Невозможно найти другую опцию – james

+0

, см. [Эту ссылку] (http://stackoverflow.com/help/self-answer), чтобы узнать об этом немного подробнее –

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