Laravel有一个(一对一的关系)

时间:2017-12-14 23:18:54

标签: laravel laravel-5 laravel-eloquent

我正在努力学习Laravel->一对一的关系。

在给定的代码链接(join)应该依赖于name(user2s表)和title(post2s表),但链接(join)依赖于my_id(user2s表)和title(post2s表)

我的完整代码

迁移: -

user2s表

Schema::create('user2s', function (Blueprint $table) {

        $table->increments('my_id');
        $table->string('name');
        $table->string('email');
        $table->string('password');
        $table->string('remember_token');
        $table->timestamps();
    });

post2u表:

Schema::create('post2s', function (Blueprint $table) {

        $table->increments('id');
        $table->integer('user_id')->unsigned();
        $table->string('title');
        $table->text('content');
        $table->timestamps();
        $table->tinyInteger('is_admin');
    });

模型User2

protected $primaryKey = 'my_id'; 


public function postx(){

    return $this->hasOne(Post2::class, 'title', 'name');
}

我的路线代码

Route::get('user/{id}/post', function($id){

    return User2::find($id)->postx;

});

http://localhost:8000/user/abc/post

错误:尝试获取非对象的属性

user2s表 enter image description here

post2s表 enter image description here

1 个答案:

答案 0 :(得分:0)

让我解释一下你的问题。

  1. 错误:尝试获取非对象的属性,这意味着它无法找到结果。结果对象为null,因此当您查找null->postx时,它无法获取任何内容。

  2. 您搜索User2::find($id),当您使用find()时,它正在寻找主键。而User2模型主键为my_id,您正在寻找Post2->标题。它无法找到它。

  3. 关于find()的更多信息 https://laravel.com/docs/5.5/eloquent#retrieving-single-models

    因为您正在寻找Post2标题。你是从User2引用的。这是不正确的。

    你应该做的是

    在你的route.php中

    Route::get('user/{title}/post', function($title){
    
        //return Post2::all();
        $post = Post2::with('userx')->where('title', $title)->first();
        dump($post); 
        dump($post->userx)//<- you can get user info via 
    });
    

    Post2模型中。

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Post2 extends Model
    {
    
        public function userx(){
    
            return $this->belongsTo(User2::class, 'user_id');
        }
    }