好吧我有一个用CodeIgniter
写的GeneralModel,一位朋友问我是否可以将它转换为Laravel 4.2
给他。我正在研究这个问题,我认为我的大部分内容都是正确的,但我在选择声明中陷入困境。
在CodeIgniter
我有以下内容:
public function getData($table, $multiple = 1, $field = FALSE, $val = FALSE){
if($field != FALSE){
// WHERE in case of FIELD / VAL :)
$this->db->where($field, $val);
}
$query = $this->db->get($table);
if($multiple == 1){
// Multiple rows
return $query->result_array();
} else {
// One row
return $query->row_array();
}
}
有没有人知道如何将此功能转换为Laravel 4.2
语法?
我目前有:
public function getData($table, $multiple = 1, $field = FALSE, $val = FALSE){
$result = DB::table($table);
}
我很快陷入困境,因为我不知道如何在Laravel 4.2
中实现同样的目标,并将query
的各个部分分开,就像我使用CodeIgniter
一样。
答案 0 :(得分:2)
您可以用相同的方式链接方法:
public function getData($table, $multiple = 1, $field = FALSE, $val = FALSE)
{
$query = DB::table($table);
if ($field != FALSE) {
// WHERE in case of FIELD / VAL :)
$query->where($field, $val);
}
if ($multiple)
return $query->get();
else
return $query->first();
}
答案 1 :(得分:1)
Laravel的相似之处在于,您可以在实际进行查询之前使用Fluent Query Builder在多个阶段构建查询。一旦你知道这一点,翻译就非常简单了:
public function getData($table, $multiple = 1, $field = FALSE, $val = FALSE)
{
$query = DB::table($table);
if($field){
// WHERE in case of FIELD / VAL :)
$query = $query->where($field, $val);
}
if($multiple) {
return $query->get();
}
return $query->first();
}
我不认为在Eloquent模型中依靠Fluent真的很好,但有些情况下无法帮助。如果当前目标是将项目转换为Laravel,那么可能会调用代码依赖于此方法存在的事实。将函数转换为使用Eloquent而不是Fluent将更改函数的签名并导致代码的其他部分中断,但它看起来像这样:
public function getData($multiple = true, $field = false, $val = false)
{
$query = $this;
if($field) {
$query = $query->where($field, $val);
}
if($multiple) {
return $query->get();
}
return $query->first();
}
可以修改调用代码本身以在Laravel中执行完全相同的功能,如下所示:
// Instead of...
$result = $model->getData(1, 'field', 'value');
// You can do this:
$result = $model->where('field', 'value')->get();
// Or this if you'd rather not have multiple:
$result = $model->where('field', 'value')->first();
从长远来看,在Eloquent(恕我直言)中使用此功能并不能真正为您节省太多时间,而是大部分时间都是混乱。