比较with()函数中的列eloquent失败

时间:2014-08-21 11:00:55

标签: php sql laravel eloquent

我有一个雄辩的模型Ledger与货币表有关,货币表与汇率有关。当我试图获得日期低于Ledger模型的汇率时,查询失败。这是我的代码。

Ledger::with('company')->with('order')->with(array('currency'=>function($query){
                $query->with(array('exchangeRates'=>function($query1){
                        $query1->whereRaw('exchange_date < ledgers.date');
                        $query1->orderBy('exchange_date','desc');
                        $query1->first();
                    }));

            }))->where('order_id','=',Input::get('order'))->get();

这是我的模特 分类帐模型

class Ledger extends \Eloquent {
protected $fillable = array(
    'company_code','order_id','account','sub_account',
    'date','document_number','document_desc','document_date',
    'booking_type','amount','currency_code','amount_currency'
);

public function company(){
    return $this->belongsTo('Company','company_code','company_code');
}

public function order(){
    return $this->belongsTo('Order','order_id','id');
}
public function account(){
    return $this->belongsTo('Account','sub_account','id');
}
public function currency(){
    return $this->belongsTo('Currency','currency_code','id');
}

}

货币模型

class Currency extends \Eloquent {
protected $fillable = array('currency_shrt_name','currency_name',
    'currency_country','currency_unit');
public function exchangeRates(){
    return $this->hasMany('ExchangeRate','currency_code','id');
}

} 汇率模型

class ExchangeRate extends \Eloquent {
protected $fillable = array('exchange_date','currency_code','currency_value');
public function currency(){
    return $this->belongsTo('Currency','currency_code','id');
}

}

1 个答案:

答案 0 :(得分:0)

如果你需要加入和比较,

Fluent可能更适合这个查询,因为在Eloquent中加载关系会运行一个没有连接的单独选择。

此查询假定您的字段名称使用标准命名约定命名。

DB::table('ledgers')
->join('companies', 'ledgers.company_id', '=', 'companies.id')
->join('orders', 'ledgers.id', '=', 'orders.ledger_id')
->join('currencies', 'ledgers.id', '=', 'currencies.ledger_id')
->join('exchange_rates', function($join)
    {
        $join->on('currency.id', '=', 'exchange_rates.currency_id');
    })
->where('exchange_rates.exchange_date', '<', 'ledgers.date')
->where('orders.id','=', Input::get('order'))
->order_by('exchange_rates.exchange_date', 'desc')
->select('field1', 'field2', 'field3')
->get();