如何在eloquent

时间:2016-01-14 21:26:11

标签: php mysql laravel laravel-5 eloquent

我正在从数据库中检索多个数据来创建学号。

喜欢 Course_ID.Year_Code.Student_no

为了检索相同的数字,我将我的原始学生编号(在创建时给出)填写为0001,0002。

当我尝试通过从数据库中获取此号码来检索我的学号时

我没有零得到结果。

让我们说 Course_ID 22 Year_Code 16

Student_NO 0005

我将号码返回为 22165 ,应为 22160005 。 这就是我学生的方式。

$students = \App\Student::with('payment')->where('branch', $id)->get();

(我实际上通过下面的查询收到了没有零的student_no)

这就是我用刀片写的方式

<td>{{$student->Course_ID.$student->course->year_code.$student->student_no}}  </td>

PS:我知道如何使用str_pad通过本机php检索数字。我问是否有一种方法可以在Eloquent上进行。

4 个答案:

答案 0 :(得分:5)

Eloquent没有直接提供的方式,所以你需要自己添加一些逻辑。

一种选择是将 student_no 存储为数据库中的字符串,否则在PHP中将其作为整数提取时将丢失零,因为PHP并不在乎关于 ZEROFILL 并将 0005 视为 5

另一个选择是在从数据库中获取数据后手动在PHP中附加零,例如通过在模型中添加访问器:

public function getStudentNoAttribute() {
  return sprintf("%05d", $this->attributes['student_no']);
}

这样,无论何时访问模型的 student_no 属性,它都会自动转换为零填充字符串。

答案 1 :(得分:2)

您可以为Eloquent模型上的任何属性创建自定义accessors。这允许您在返回时修改该属性。

创建访问器的约定是创建一个以get开头的方法,然后添加属性名称,然后添加Attribute。例如,您可以调用一个getStudentNoAttribute。将其添加到学生模型中:

function getStudentNoAttribute() {
    return str_pad($this->student_no,4,'0',STR_PAD_LEFT);
}

为要使用零调整的每个属性添加这样的函数。然后,每当您在$student->student_no模型的实例上调用Student时,它都会正确格式化。

答案 2 :(得分:0)

在表格中创建作为STUDENT_NO INT(5)ZEROFILL的列,然后在查询时,任何小于10000的数字都会根据需要具有前导零 例如,5将显示为00005,而4124将显示为04124等。

答案 3 :(得分:0)

接受的答案似乎很好,但Laravel accessors要求将值传递给函数,否则您将遇到一些问题。这可能是最近的变化,但我认为值得一提。那么,答案就会变成:

public function getStudentNoAttribute($value) {
    return sprintf("%05d", $value);
}

或,正如@Andy Noelker的答案所说:

function getStudentNoAttribute($value) {
    return str_pad($value,4,'0',STR_PAD_LEFT);
}