我有一个名为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构建器执行此操作?
答案 0 :(得分:4)
如果不将此函数转换为SQL语句,您将无法在查询中使用此属性。
然后,您可以使用sortBy
函数查询此模型并对其进行排序。这将在从数据库中提取集合后将其收集在内存中。
$customers = Customers::get()->sortBy('name');
请注意,不建议将其用于大型集合(> ~10k)。然后你应该考虑将它转换为SQL语句。
答案 1 :(得分:0)
要改善@tomaytotomato答案,您可以使用Laravel cursor()方法减少内存使用和执行时间
$customers = Customers::cursor()->sortBy('name');