将用户分配到 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
记录限制为仅在其User
与Shop
相同时才包含在内。我会写一个简单的例子。
【参考方案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);
->whereHas()
所做的是限制获取您的 Expense
模型的查询以尊重您传递的逻辑,在这种情况下仅包括 Expense
具有相同 user
的模型 shop_id
作为当前登录的User
。
注意:如果当前的User
没有Shop
,它可能会返回意外的结果,但您可以保护路由只允许带有Shop
的User
访问它,等等。
【讨论】:
我不了解User
,我可以改变它吗?
抱歉,不确定您要问什么。我不好,参数是user
(小写),而不是User
。
仍然没有解决问题,我对create shop
有疑问,如何与您分享图像?我想分享我的截图
这可能是你的关系逻辑。你不应该在shops
上同时拥有user_id
,在users
上同时拥有shop_id
。 User
应该是 belongTo()
和 Shop
,而 Shop
应该是 hasMany()
User
s。另外,Expense
模型是否具有shop
关系?因为你可以直接查询。
我应该删除它吗?以上是关于将用户分配到 Laravel 关系中的任何商店?的主要内容,如果未能解决你的问题,请参考以下文章
如何将参数传递到链式 Laravel Eloquent 关系中的位置