如何获得一对一关系的结果
How to get result of one to one relationship
我正在使用 Laravel 8 制作一个基本的在线订购系统。
并且在这个项目中,每一个订单都是在已经登录的用户的一个用户内提交的。
因此 users
table 和 orders
table.[=27= 之间存在 一对一 关系]
因此,我将这些添加到模型中:
Order.php
:
public function user()
{
return $this->hasOne(User::class);
}
User.php
:
public function order()
{
return $this->belongsTo(Order::class);
}
现在为了获得 table 的结果以显示订购者的用户名,我在 Controller 中编写了以下代码:
public function awaiting()
{
$orders = Order::with('user')->where('user_id', '!=', NULL)->latest()->paginate(20);
return view('admin.orders.awaiting', compact('orders'));
}
然后在 Blade:
@foreach($orders as $order)
<tr>
<td>{{ $order->user->name }}</td>
<td>{{ $order->description }}</td>
<td>{{ $order->dimensions }}</td>
<td>{{ $order->color }}</td>
<td>{{ $order->material }}</td>
<td>{{ $order->title }}</td>
<th scope="row">{{ ++$menuCounter }}</th>
</tr>
@endforeach
但这是错误的,因为它在 users
table(不存在)处搜索 order_id
。
那么问题来了,如何根据存储在orders
table.
中的user_id
显示下单用户的用户名
更新 #1:
Orders
迁移:
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('material');
$table->string('color');
$table->string('dimensions');
$table->string('description')->nullable();
$table->tinyInteger('user_id')->unsigned()->nullable();
$table->timestamps();
});
Users
迁移:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->tinyInteger('adm')->unsigned()->nullable();
$table->rememberToken();
$table->timestamps();
});
}
您可以使用 whereHas
而不是检查 null
。尝试更改。
$orders = Order::with('user')->whereHas('user')->latest()->paginate(20);
你们关系不对所以
Order.php:
public function user()
{
return $this->belongsTo(User::class);
}
User.php:
public function order()
{
return $this->hasOne(Order::class);
}
我正在使用 Laravel 8 制作一个基本的在线订购系统。
并且在这个项目中,每一个订单都是在已经登录的用户的一个用户内提交的。
因此 users
table 和 orders
table.[=27= 之间存在 一对一 关系]
因此,我将这些添加到模型中:
Order.php
:
public function user()
{
return $this->hasOne(User::class);
}
User.php
:
public function order()
{
return $this->belongsTo(Order::class);
}
现在为了获得 table 的结果以显示订购者的用户名,我在 Controller 中编写了以下代码:
public function awaiting()
{
$orders = Order::with('user')->where('user_id', '!=', NULL)->latest()->paginate(20);
return view('admin.orders.awaiting', compact('orders'));
}
然后在 Blade:
@foreach($orders as $order)
<tr>
<td>{{ $order->user->name }}</td>
<td>{{ $order->description }}</td>
<td>{{ $order->dimensions }}</td>
<td>{{ $order->color }}</td>
<td>{{ $order->material }}</td>
<td>{{ $order->title }}</td>
<th scope="row">{{ ++$menuCounter }}</th>
</tr>
@endforeach
但这是错误的,因为它在 users
table(不存在)处搜索 order_id
。
那么问题来了,如何根据存储在orders
table.
user_id
显示下单用户的用户名
更新 #1:
Orders
迁移:
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('material');
$table->string('color');
$table->string('dimensions');
$table->string('description')->nullable();
$table->tinyInteger('user_id')->unsigned()->nullable();
$table->timestamps();
});
Users
迁移:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->tinyInteger('adm')->unsigned()->nullable();
$table->rememberToken();
$table->timestamps();
});
}
您可以使用 whereHas
而不是检查 null
。尝试更改。
$orders = Order::with('user')->whereHas('user')->latest()->paginate(20);
你们关系不对所以
Order.php:
public function user()
{
return $this->belongsTo(User::class);
}
User.php:
public function order()
{
return $this->hasOne(Order::class);
}