在Laravel4中返回一个急切加载的对象

时间:2013-07-06 15:16:26

标签: php laravel laravel-4 eloquent

我需要急切加载的对象而不是返回给AJAX的父对象。

我有2张桌子,厨师和位置。我想在地点的城市字段中返回所有拥有特定值的地点的厨师。

我可以成功选择和过滤已加载链接Chefs的地点。但我想要归还厨师,而不是地点。理想情况下,厨师和他们的地点渴望加载将是伟大的。但是,如何根据关系的字段值选择Chef?

class Location extends Eloquent {
    protected $table = 'locations';

    public function chef() {
        return $this->belongsTo('Chef');
    }
}

class Chef extends Eloquent {
    protected $table = 'chefs';

    public function location() {
        return $this->hasMany('Location');
    }
}

在我的Controller类中我有:

class DishController extends BaseController {
    if ($loc_search) {
        $locations = Location::with('chef')->where('city', 'LIKE', "%$loc_search%");
        $chefstemp = array();
        foreach ($locations->get() as $loc) {
            if (strpos($loc->city, $loc_search) !== FALSE) {
                array_push($chefstemp, $loc->chef);
            }
    }
    return $chefstemp;
    }
}

当然Controller不会返回JSON所以这不起作用,但我想表明我的想法。

1 个答案:

答案 0 :(得分:0)

我得到了它的工作,但我正在对数据库进行多次点击。 MySQL能够根据我的标准为找到的集合组成一个Select语句。我仍然希望在Eloquent中找到一种方法。

    $chef_ids = array();

    $chefQuery = Chef::where('name', 'LIKE', "%$chef_search%");
    if ($chef_search) {
        foreach ($chefQuery->get(array('id')) as $chef) {
            $chef_ids[] = $chef->id;
        }
    }
    if ($loc_search) {
        $locations = Location::where('city', 'LIKE', "%$loc_search%")->get(array('chef_id'));
        foreach ($locations as $loc) {
            $chef_ids[] = $loc->chef_id;
        }
    }
    $dishes = Dish::whereIn('chef_id', $chef_ids)->with(array('chef', 'dishimage', 'chef.location'))->get();
    return $dishes;