在Laravel 5模型中按自定义属性排序?

时间:2017-08-09 09:09:25

标签: php laravel laravel-5 eloquent

我有一个名为customers的模型,它有一个名为name的自定义属性;这可以是客户的全名或公司名称,具体取决于他们的帐户类型。

class Customer extends Model
{

    const BUSINESS = "Business";
    const INDIVIDUAL = "Individual";

    protected $table = 'users';
    protected $appends = ['name'];
    private $name;

    public static function boot()
    {
        parent::boot();

        static::created(function () {
        });

        static::updating(function () {
        });
    }


    /**
     * Get the display name for the customer
     * 
     * if Customer::BUSINESS then use company field
     * else if Customer::INDIVIDUAL then use their name
     * 
     * @return mixed|string
     */
    function getDisplayName() {
        return ($this->account == Customer::BUSINESS) ? $this->company : $this->getContactName();
    }

    public function getContactName()
    {
        return ucfirst($this->first_name) . " " . ucfirst($this->last_name);
    }

    /**
     * @return mixed
     */
    public function getName()
    {
        return $this->getDisplayName();
    }

    /**
     * @param mixed $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }
}

如果可能,我希望能够 ORDER BY 此自定义属性。

目前,Laravel抛出错误,指出name不是定义的列。

有没有办法使用Laravel Query构建器执行此操作?

2 个答案:

答案 0 :(得分:4)

如果不将此函数转换为SQL语句,您将无法在查询中使用此属性。

然后,您可以使用sortBy函数查询此模型并对其进行排序。这将在从数据库中提取集合后将其收集在内存中。

$customers = Customers::get()->sortBy('name');

请注意,不建议将其用于大型集合(> ~10k)。然后你应该考虑将它转换为SQL语句。

答案 1 :(得分:0)

要改善@tomaytotomato答案,您可以使用Laravel cursor()方法减少内存使用和执行时间

$customers = Customers::cursor()->sortBy('name');