【问题标题】:Using custom method names in Eloquents "One to many" relationship在 Eloquents “一对多”关系中使用自定义方法名称
【发布时间】:2020-03-08 02:37:56
【问题描述】:

我有 2 个具有简单 one to many 关系的表。

用户表:

id (primary key)
-- other columns ...

帖子表:

id (primary key)
user_id
-- other columns ...

在用户模型中我有:

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User 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('App\Post');
    }
}

在 Post 模型中我有:

namespace App;

use Illuminate\Database\Eloquent\Model;


class Post extends Model
{
    public function userbla() {
        return $this->belongsTo( "App\User",'user_id', 'id' );
    }
}

然后,我有一个控制器:

use App\User;
use App\Post;


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。

附: 如果我使用的不是usersbla 名称,而是user,那么案例2 也可以工作并提供有效对象。

请告诉我,为什么我可以为案例 1 使用自定义方法名称,而不能为案例 2 使用?

【问题讨论】:

  • 你能给你的桌子图片吗?????
  • 顺便说一句,laravel 有函数dd($someData) 转储数据并死掉。用它代替var_dump($someData); exit;
  • 你的帖子模型中有user 关系吗?
  • @OTAR 因为在 belongsTo 的情况下,Laravel “通过检查关系方法的名称并在方法名称后加上 _id 来确定默认的外键名称。”。
  • @OTAR in case of hasMany "Eloquent 将采用拥有模型的 "snake case" 名称并以 _id 为后缀。"

标签: php laravel laravel-5 eloquent relationship


【解决方案1】:

在您的情况下,您需要通过添加 foreignKey 来指定 belongsTo 方法的第二个参数,因为您的方法名称是 userbla 并且 laravel 说:

Eloquent 通过检查关系方法的名称并在方法名称后加上_id 来确定默认的外键名称。

return $this->belongsTo('App\User', 'user_id');

在hasMany的情况下

Eloquent 将采用拥有模型的“snake case”名称并以 _id 为后缀。

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多