我正在努力学习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
错误:尝试获取非对象的属性
答案 0 :(得分:0)
让我解释一下你的问题。
错误:尝试获取非对象的属性,这意味着它无法找到结果。结果对象为null
,因此当您查找null->postx
时,它无法获取任何内容。
您搜索User2::find($id)
,当您使用find()
时,它正在寻找主键。而User2
模型主键为my_id
,您正在寻找Post2->标题。它无法找到它。
关于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');
}
}