Laravel - 按标题搜索?

时间:2015-02-18 10:57:43

标签: php laravel laravel-4 eloquent

如何仅通过title中的ServiceType进行搜索? Package中还有一个应该避免的标题字段

例如,在模型中:

class Package extends Eloquent {
    protected $table = 'package';

    function serviceType()
    {
        return $this->belongsTo('ServiceType');
    }

    public static function getPackagesByServiceType($service)
    {
        return Package::with('serviceType')->where('title', '=', $service);
    }
}

注意:

Package

中的idtitleserviceType字段中有service_type_id字段

在控制器中:

$packages = Package::getPackagesByServiceType('something')->get();

由于某种原因没有出现结果?它应该在something

中搜索serviceType

似乎将with()where()结合起来并不起作用。当我删除where()并且它可以正常工作时。

3 个答案:

答案 0 :(得分:1)

您不能使用此类where()按相关模型进行过滤。您应该使用whereHas()代替:

public static function getPackagesByServiceType($service)
{
    return Package::with('serviceType')->whereHas('serviceType', function($q) use ($service){
        $q->where('title', '=', $service);
    });
}

请注意,如果您之后不需要serviceType,则不必急于加载它,因此您可以删除with('serviceType')


此外,如果您在控制器中拨打get(),则应使用query scope。它提供相同的功能,但它不是静态功能,它是 Laravel方式

public function scopeByServiceType($query, $service){
    return $query->with('serviceType')->whereHas('serviceType', function($q) use ($service){
        $q->where('title', '=', $service);
    });
}

你这样使用它:

$packages = Package::byServiceType('something')->get();

答案 1 :(得分:-2)

->get()应该在模型中

public static function getPackagesByServiceType($service)
{
    return Package::with('serviceType')->where('title', '=', $service)->get(); // here
}

在控制器中它应该是这样的:

$packages = Package::getPackagesByServiceType('something');

希望有所帮助......我的模型 - 控制器结构中存在类似问题......

答案 2 :(得分:-2)

class Package extends Eloquent {
    protected $table = 'package';

    function serviceType()
    {
        return $this->belongsTo('ServiceType');
    }

    public static function getPackagesByServiceType($service)
    {
        return Package::with('serviceType')->where('title', '=', $service)->get();
    }
}

你忘记了 - > get();