laravel关系(多对多+一对多)有问题,由于某种原因无法访问它们

pgvzfuti  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(188)

我有一个数据库
一个“使用者”有许多“输入”,而“输入”只有一个“习性”和“情感”,所以我们可以说一个使用者有许多“习性”,也有许多“情感”。
我应该可以做一些类似{{$user-〉input-〉habitos}}的事情,但是由于某种原因我做不到,{{$user-〉input}}可以工作,{{$input-〉habitos}}也可以工作,下面是代码
用户模型:

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
        'telefone',
        'hotmart_id'
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function input(){
        return $this->hasmany(Input::class, 'user_id', 'id');
    }

}

输入模型:

class Input extends Model
{
    use HasFactory;

    public function habito(){
        return $this->belongsto(Habito::class, 'habito_id', 'id');
    }

    public function sentimento(){
        return $this->belongsto(Sentimento::class, 'sentimento_id', 'id');
    }

    public function user(){
        return $this->belongsto(User::class, 'user_id', 'id');
    }
}

哈比托模型:

class Habito extends Model
{
    use HasFactory;

    protected $fillable = ['nome', 'categoria'];

    public function input(){
        return $this->hasmany(Input::class, 'habito_id', 'id');
    }
}

我一直在寻找有同样问题的人,但我似乎什么都找不到,提前感谢:)。

hxzsmxv2

hxzsmxv21#

我也遇到了同样的问题,嗯...几乎一样。我的Meals有一个带标签的透视表-所以它是一个多对多的关系,标签有一个翻译。
想象一下,当你使用查询“with=tags”来获取数据时,你实际上是根据区域设置(en,de,fr等)来获取标签翻译,所以你通过“meal_tag”透视表,通过“tag”表,最后你到达“tagtranslations”并获取连接到该餐的tag_id的翻译.
我不认为你必须使用这是我怎么做的:
膳食类别:

public function tags(){
        return $this->belongsToMany(Tag::class, 'meal_tags')->withTrashed();
    }

餐标类:

public function meals()
    {
        $this->hasMany(Meal::class, 'meal_id')->withTrashed();
    }

    public function tags()
    {
        $this->hasMany(Tag::class, 'tag_id')->withTrashed();
    }

标记类:

public function meals()
{
    return $this->belongsToMany(Meal::class, 'meal_tags')->withTrashed();
} 

public function translations()
{
    return $this->hasOne(TagTranslation::class)->where('locale', app()->getLocale())->withTrashed();
}

**忽略翻译中间件,因为您不需要它,如果您使用softDeletes,只需使用withTrashed

最后是TagTranslations类:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Staudenmeir\EloquentHasManyDeep\HasRelationships;

class TagTranslation extends Model
{
    use HasFactory, SoftDeletes, HasRelationships;

public function tag(){
    return $this->belongsTo(Tag::class)->withTrashed();
}

public function meals(){
    return $this->hasManyDeep(Meal::class, [Tag::class, 'tag_id','meal_id'])->withTrashed;
}

}
注意我使用的是hasManyDeep,为此你必须安装staudenmeir包:但问题是,即使没有hasManyDeep,Eloquent也应该识别你需要的一切,但如果它是这样工作的,我又有什么资格争论呢?
这对我很有效--如果出了什么问题,我相信这只是一个稍微调整的问题。

相关问题