【问题标题】:Eloquent relationship in Laravel 6. Can't modify/overwrite relationship attributeLaravel 6中的雄辩关系。无法修改/覆盖关系属性
【发布时间】:2020-07-31 01:14:33
【问题描述】:

我在两个 Eloquent 模型之间建立了一对一的关系,我想在我的 User Eloquent 模型中替换一个名为 profile_picture 的关系属性,但我不知道该怎么做。

这是我的User 模型的摘要。

class User extends Authenticatable implements JWTSubject{

    use Notifiable;

    public function profile_picture(){
        return $this->hasOne(UserProfilePicture::class);
    }
}

这是我的UserProfilePicture 模型的摘要。

class UserProfilePicture extends Model{

    public function user(){
        return $this->belongsTo(User::class);
    }
}

这就是我在我的UserController 文件中假装这样做的方式。

public function publicUserData($username){

    $user = User::where("username", $username)->with("profile_picture")->first();

    if($user){
        if(!$user->profile_picture){
            $user->profile_picture = UserProfilePicture::$defaultUserProfilePicture;
        }
        return response()->json($user);
    }

    return response()->json(false);
}

这是$defaultUserProfilePicture 静态数组。

public static $defaultUserProfilePicture = [
    "url" => "public/avatars/defaultUserPhoto.jpg",
    "size" => 5229
];

我尝试使用 mutators,但看起来它不适用于关系属性。

我找到了this,但对我不起作用。

提前致谢。

【问题讨论】:

  • setRelation 不适合你吗?如$user->setRelation('profile_pic', UserProfilePi...::$default)
  • 我什至没有尝试过,它存在于 Laravel 6 中?,我在 Laravel Docs 中找不到它!
  • 它不起作用,$user->setRelation("profile_picture", UserProfilePicture::$defaultUserProfilePicture); ... :(

标签: php laravel eloquent


【解决方案1】:

您可以为关系默认模型提供属性,您可以将数组或闭包传递给withDefault方法

public function profile_picture(){
    return $this->hasOne(UserProfilePicture::class)->withDefault(UserProfilePicture::$defaultUserProfilePicture);
}

参考:https://laravel.com/docs/7.x/eloquent-relationships#default-models

【讨论】:

    【解决方案2】:

    我解决了,首先我将静态数组UserProfilePicture::$defaultUserProfilePicture 放入我的数据库然后我这样做:

    $user->setRelation("profile_picture", UserProfilePicture::find(1));
    

    这需要一个额外的数据库请求,但这是我目前拥有的一种解决方案。

    【讨论】:

    • 如果您只希望该实体具有这 2 个属性,您可以在不访问数据库的情况下做到这一点,假设这 2 个字段是可填写的:UserProfilePicture::make( $thatArray ) 那么您将拥有一个具有这些属性的实例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2018-11-28
    • 2015-01-11
    • 2021-06-03
    • 2020-03-26
    相关资源
    最近更新 更多