在口才关系中使用自定义方法名称"One to many"



我有两个具有简单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。

最新更新