【问题标题】:Assign User to any Shop in Laravel Relationship?将用户分配到 Laravel 关系中的任何商店?
【发布时间】: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之间的链接/关系,查看特定的相关记录还需要路由和自定义约束逻辑等等。你试过了吗?您遇到了什么特定错误?请先展示您的尝试; Stackoverflow 不是代码编写服务。这绝对是可行的,但您需要先尝试一下。
  • 我试过不能限制用户只能看到他们的商店。@TimLewis
  • 如果您尝试过某事,请展示您尝试过的内容;当我们知道具体问题及其原因时,帮助肯定会更容易。
  • 你需要看什么?模型或控制器@TimLewis
  • 好多了!因此,目前,您只需返回所有Expense 记录,而不管关联的User 及其链接的Shop。因此,您需要做的是检查当前用户,并将返回的Expense 记录限制为仅在其UserShop 相同时才包含在内。我会写一个简单的例子。

标签: php laravel eloquent foreign-keys


【解决方案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 关系?因为你可以直接查询。
  • 我应该删除它吗?
猜你喜欢
  • 2019-12-31
  • 2020-10-10
  • 2020-12-10
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 2016-05-27
  • 2021-10-21
相关资源
最近更新 更多