Laravel - 按标题搜索?

Laravel - search by title?

如何只在ServiceType中按title搜索? Package 中还有一个 title 字段,应该避免

例如,在模型中:

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);
    }
}

注:

Packageid中有一个service_type_id字段,在serviceType

中有title字段

在控制器中:

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

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

中搜索 something

with()where() 组合起来好像不行。当我删除 where() 并且它起作用时。

->get() 应该在模型中

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

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

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

希望对您有所帮助...我在模型 - 控制器结构中遇到了类似的问题....

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();

您不能像那样使用 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();