Home >Backend Development >PHP Tutorial >Laravel5学生成绩管理系统-04-Eloquent关联

Laravel5学生成绩管理系统-04-Eloquent关联

WBOY
WBOYOriginal
2016-06-23 13:07:09976browse

     数据表之间经常会互相进行关联。例如,一篇博客文章可能会有多条评论,或是一张订单可能对应一个下单客户。Eloquent 让管理和处理这些关联变得很容易,同时也支持多种类型的关联:

一对一#

一对一关联是很基本的关联。例如一个 User 模型也许会对应一个 Phone。要定义这种关联,我们必须将 phone 方法放置于 User 模型上。phone 方法应该要返回基类 Eloquent 上的hasOne 方法的结果:

<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class User extends Model{    /**     * 获取与指定用户互相关联的电话纪录。     */    public function phone()    {        return $this->hasOne('App\Phone');    }}

传到 hasOne 方法里的第一个参数是关联模型的类名称。定义好关联之后,我们就可以使用 Eloquent 的动态属性来获取关联纪录。动态属性让你能够访问关联函数,就像他们是在模型中定义的属性:

$phone = User::find(1)->phone;

Eloquent 会假设对应关联的外键名称是基于模型名称的。在这个例子里,它会自动假设 Phone模型拥有 user_id 外键。如果你想要重写这个约定,则可以传入第二个参数到 hasOne 方法里。

return $this->hasOne('App\Phone', 'foreign_key');

此外,Eloquent 的默认外键在上层模型的 id 字段会有个对应值。换句话说,Eloquent 会寻找用户的 id 字段与 Phone 模型的 user_id 字段的值相同的纪录。如果你想让关联使用 id以外的值,则可以传递第三个参数至 hasOne 方法来指定你自定义的键:

return $this->hasOne('App\Phone', 'foreign_key', 'local_key');

查看官方文档


项目实战:

创建学生成绩表grades,并建立外键user_id与用户表id关联:


因为一个用户只能对应一个成绩表,所以这是一对一模型,然后在用户模型中添加成绩关联

          <?phpnamespace App;use Illuminate\Auth\Authenticatable;use Illuminate\Database\Eloquent\Model;use Illuminate\Auth\Passwords\CanResetPassword;use Illuminate\Foundation\Auth\Access\Authorizable;use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;class UsersInfo extends Model implements AuthenticatableContract,                                    AuthorizableContract,                                    CanResetPasswordContract{    use Authenticatable, Authorizable, CanResetPassword;    /**     * The database table used by the model.     *     * @var string     */    protected $table = 'users_info';    /**     * The attributes that are mass assignable.     *     * @var array     */    protected $fillable = ['name', 'email', 'is_admin', 'password','sex','phone','pro_class'];    /**     * The attributes excluded from the model's JSON form.     *     * @var array     */    protected $hidden = ['password', 'remember_token'];    /**     * 登录验证规则     * @return [type] [description]     */    protected static function rules()    {        return [            'id' => 'required|digits:10',            'password' => 'required'        ];    }    /**     * 建立一对一关系     */    public function grade()    {        return $this->hasOne('App\Grade');    }}


根据某个登陆用户,然后获取该登陆用户的成绩(联合查询):

      /** * 返回学生主页 */public function home(){    $grade = Auth::user()->grade;    return view('stu.home', compact('grade'));}


但是这里会报错

为什么会报错呢?

经过分析,查询官方文档,Eloquent 会假设对应关联的外键名称是基于模型名称的。在这个例子里,它会自动假设 Grade模型拥有 users_info_id 外键。如果你想要重写这个约定,则可以传入第二个参数到 hasOne 方法里。

      /** * 建立一对一关系 */public function grade(){   // grade表的外键为user_id    return $this->hasOne('App\Grade', 'user_id');}


查看成绩:

此外,Eloquent 的默认外键在上层模型的 id 字段会有个对应值。换句话说,Eloquent 会寻找用户的 id 字段与 Grade 模型的 user_id 字段的值相同的纪录。如果你想让关联使用 id以外的值,则可以传递第三个参数至 hasOne 方法来指定你自定义的键:

 // 这里假设user表的email和grade表的user_id为关联的字段return $this->hasOne('App\Grade', 'user_id', 'email');







Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn