我有两个具有简单one to many
关系的表。
用户表:
id (primary key)
-- other columns ...
帖子表:
id (primary key)
user_id
-- other columns ...
在用户模型中,我有:
namespace App;
use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function postsbla() {
return $this->hasMany('AppPost');
}
}
在后模型我有:
namespace App;
use IlluminateDatabaseEloquentModel;
class Post extends Model
{
public function userbla() {
return $this->belongsTo( "AppUser",'user_id', 'id' );
}
}
然后,我有一个控制器:
use AppUser;
use AppPost;
public function index()
{
$a = true;
if($a) { // case 1
$user_id = 1;
$user_posts = User::find( $user_id )->postsbla;
var_dump($user_posts); exit;
}
else { // case 2
$post_id = 5;
$post_owner_user_data = Post::find( $post_id )->usersbla;
var_dump($post_owner_user_data); exit;
}
}
如果$a === true
(情况1(,则自定义方法名称postsbla()
有效,var_dump返回有效对象,但如果$a === false
(情况2(,则定制方法名称usersbla()
无效,并返回NULL。
p.S。如果我使用的不是usersbla
名称,而是user
,那么情况2也适用,并且给出了有效的对象。
请告诉我,为什么我可以在情况1中使用自定义方法名称,而不能在情况2中使用?
在您的情况下,您需要通过添加foreignKey
来指定belongsTo方法的第二个参数,因为您的方法名称是userbla
,laravel说:
Eloquent通过检查关系方法的名称并在方法名称后面加上
_id
来确定默认的外键名称。
return $this->belongsTo('AppUser', 'user_id');
在hasMany 的情况下
Eloquent将采用拥有模型的"snake case"名称,并在其后缀为_id。