将用户分配到 Laravel 关系中的任何商店?

Posted

技术标签:

【中文标题】将用户分配到 Laravel 关系中的任何商店?【英文标题】:Assign User to any Shop in Laravel Relationship? 【发布时间】:2019-12-30 20:29:27 【问题描述】:

在 laravel 中,我有 3 张桌子

用户 // 用于身份验证并在登录后创建另一个用户 费用 店铺

我的目的-我希望用户可以注册,并且可以在他们登录时创建另一个用户并且可以根据需要将assign 用户添加到另一个Shop..

只有User in the Same Shop 可以看到他们的Expense..

//我的User

<pre>
   Schema::create('users', function (Blueprint $table) 
        $table->bigIncrements('id');
        $table->unsignedBigInteger('shop_id')->nullable();
        $table->unsignedBigInteger('user_id')->nullable();
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    );
</pre>

//我的Expense

<pre>
    Schema::create('expenses', function (Blueprint $table) 
        $table->bigIncrements('id');
        $table->unsignedBigInteger('user_id');
        $table->date('date');
        $table->string('description');
        $table->double('amount');
        $table->timestamps();
        $table->foreign('user_id')->references('id')->on('users');
    );
</pre>

//我的Shop

<pre>
     Schema::create('shops', function (Blueprint $table) 
        $table->bigIncrements('id');
        $table->unsignedBigInteger('expense_id')->nullable();
        $table->unsignedBigInteger('user_id');
        $table->string('name');
        $table->string('description');
        $table->timestamps();
        $table->foreign('expense_id')->references('id')->on('expenses');         
        $table->foreign('user_id')->references('id')->on('users');         
    );
</pre>

// 我的用户模型

<pre>
   public function expense()
    
        return $this->hasMany(\App\Expense::class);
    


    public function shop()
    
        return $this->hasMany(\App\Shop::class, 'user_id');
    
</pre>

// 我的费用模型

<pre>
class Expense extends Model

    protected $fillable = ['date', 'description', 'amount', 'user_id', 'shop_id'];

    public function user()
    
        return $this->belongsTo(\App\User::class);  
    


</pre>

// 我的店铺模型

<pre>
class Shop extends Model

    protected $fillable = ['name', 'description', 'expense_id', 'shop_id'];

    public function user()
    
        return $this->belongsTo(\App\User::class, 'user_id');
    


</pre>

// 费用控制人

<pre>
 public function index(Request $request)
    
        $expense = Expense::with(['user'])->get();

        return ExpenseResource::collection($expense);

        // dd(auth()->user());
    

    public function create(Request $request)
    
        $request->validate([
            'date' => 'required',
            'description' => 'required',
            'amount' => 'required',

        ]);

        $expense = new Expense();
        $expense->user_id = auth()->user()->id;
        $expense->date = $request->date;
        $expense->description = $request->description;
        $expense->amount = $request->amount;
        $expense->save();

        return new ExpenseResource($expense);
    
</pre>

//在我的用户控制器中

<pre>
public function index()
    
        $users = User::all();
        $shops = Shop::all();
        return view('user', compact('users', 'shops'));
        // return UserResource::collection($users);
    

    public function create(Request $request)
    
        $request->validate([
            'name' => 'required',
            'email' => 'required',
            'password' => 'required',
        ]);

        $user = new user();
        $user->user_id = auth()->user()->id;
        $user->name = $request->name;
        $user->email = $request->email;
        $user->password = bcrypt($request->password);
        $user->save();

        return new UserResource($user);
    
</pre>

有意义吗?

任何想法,谢谢..

【问题讨论】:

这太宽泛了。创建用户需要一个表单、模型、路由和控制器,分配给Store需要模型/sql之间的链接/关系,查看特定的相关记录还需要路由和自定义约束逻辑等等。你试过了吗?您遇到了什么特定错误?请先展示您的尝试; *** 不是代码编写服务。这绝对是可行的,但您需要先尝试一下。 我试过不能限制用户只能看到他们的商店。@TimLewis 如果您尝试过某事,请展示您尝试过的内容;当我们知道具体问题及其原因时,帮助肯定会更容易。 你需要看什么?模型或控制器@TimLewis 好多了!因此,目前,您只需返回所有Expense 记录,而不管关联的User 及其链接的Shop。因此,您需要做的是检查当前用户,并将返回的Expense 记录限制为仅在其UserShop 相同时才包含在内。我会写一个简单的例子。 【参考方案1】:

如 cmets 中所述,您需要检查当前的 User 并将返回的 Expense 记录限制为仅 1) 具有 User 和 2) 与 Store 匹配的相同当前User。这可以在单个 whereHas() 子句中完成:

public function index(Request $request) 
  $user = auth()->user(); // If using default `Auth` logic.

  $expenses = Expense::whereHas('user', function($subQuery) use($user)
    return $subQuery->where('shop_id', '=', $user->shop_id);
  )->with(['user'])->get();

  return ExpenseResource::collection($expenses);

-&gt;whereHas() 所做的是限制获取您的 Expense 模型的查询以尊重您传递的逻辑,在这种情况下仅包括 Expense 具有相同 user 的模型 shop_id作为当前登录的User

注意:如果当前的User 没有Shop,它可能会返回意外的结果,但您可以保护路由只允许带有ShopUser 访问它,等等。

【讨论】:

我不了解User,我可以改变它吗? 抱歉,不确定您要问什么。我不好,参数是user(小写),而不是User 仍然没有解决问题,我对create shop 有疑问,如何与您分享图像?我想分享我的截图 这可能是你的关系逻辑。你不应该在shops 上同时拥有user_id,在users 上同时拥有shop_idUser 应该是 belongTo()Shop,而 Shop 应该是 hasMany() Users。另外,Expense 模型是否具有shop 关系?因为你可以直接查询。 我应该删除它吗?

以上是关于将用户分配到 Laravel 关系中的任何商店?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递到链式 Laravel Eloquent 关系中的位置

在Laravel的简单页面上传递关系中的计数

我如何在 laravel 中为 spatie 包(ACL 管理)中的其他角色分配用户列表权限?

Laravel 关系上的枢轴关系 (Eloquent)

使用 Laravel 4 实现用户/角色/权限

laravel 中的多提供者关系用户表