![](/img/trans.png)
[英]Creating custom redirect logic in Laravel 5.3; can't log users in
[英]Users address logic in laravel
我的laravel应用程序users
和addresses
有2个表,并且两个表都在运行中,我想做的是:
我是否需要第3个表(例如address_user
来获取用户和地址ID,或者现在我可以将primary
列添加到地址表中就可以了?
这是我所拥有的:
user
模型
public function addresses(){
return $this->hasMany(Address::class);
}
Address
模型
public function user(){
return $this->belongsTo(User::class);
}
Address table
Schema::create('addresses', function (Blueprint $table) {
$table->increments('id');
$table->string('address');
$table->string('city');
$table->string('postalcode')->nullable();
$table->string('province');
$table->integer('user_id')->unsigned();
$table->timestamps();
});
Schema::table('addresses', function (Blueprint $table) {
$table->foreign('user_id')->references('id')->on('users');
});
这是我打印当前用户索引中的数据的方式
<td class="text-center">
<ol>
@foreach($user->addresses as $uad)
<li>{{$uad->address}}<br>{{$uad->city}},{{$uad->postalcode}},{{$uad->province}}</li>
@endforeach
</ol>
</td>
因此,根据建议,我在addresses
表中添加了is_primary
列,我可以将其设置为0
和1
以获得用户的主要地址, 但
现在我在用户编辑页面中,我有2个地址属于ID为
1
用户,现在我想将选定的主地址更改为另一个地址,但是我在用户配置文件中编辑如何在表单路由时更新地址表is_primary
列是users.update
而不是addresses_update
?
我做了一些更改,这里是:
address_id
列 is_primary
列了。 为什么? 因为用户可以将许多地址设置为主要地址! 通过这种方式,用户只能将1个地址设置为主地址,该地址将获得该地址的ID。 1-我无法获取用户的主要地址(不知道如何!)
这是我获取用户地址的方式:
@foreach($user->addresses as $address)
<p>
{{$address->address}}<br>
{{$address->city}}, {{$address->province}}<br>
{{$address->country}}<br>
{{$address->postalcode}}
</p>
@endforeach
但是我无法获得用户的主要地址。
因为$user->addresses
将为您提供Illuminate \\ Database \\ Eloquent \\ Collection的实例,所以您可以根据需要过滤该集合。
User
类方法的示例:
public function getPrimaryAddress(): Address
{
return $this->addresses->where("is_primary", "=", 1)->first();
}
当然,您首先要获得在大多数情况下仍要执行的所有地址。 如果您要发出单个查询并获取主地址,您仍然可以使用
public function getPrimaryAddress(): Address
{
return Address::where('user_id', '=', $this->id)->andWhere('is_primary', '=', 1)->first();
}
但是这两个都暗示您在addresses
表中有is_primary
列。
如果要获取列表并在循环中检查该地址是否为主要地址,则在addresses
表中使用is_primary
会is_primary
。
foreach ($user->addresses as $address) {
if ($address->is_primary) { /* this address is primary */ }
}
要更改主地址需要设置is_primary
为这已经是小学到地址0
和属性设置is_primary
现在小学地址到1
。
public function setPrimaryAddress($address): bool
{
if (is_numeric($address)) { // Should be PK.
$address = Address::find($address);
}
$prev = $this->getPrimaryAddress();
if ($address->id == $prev->id) {
return true;
}
if ($prev->update(['is_primary' => 0])) {
return $address->update(['is_primary' => 1]);
}
return false;
}
如果您希望拥有一个地址,以便一个用户可以拥有多个地址,而且一个地址可以属于多个用户,那么使用建议的address_user
这样的数据透视表来建立多对多关系就可以了。 如果您要避免重复数据,或者要考虑几个共享地址的人,这将很有用。
关于允许用户拥有主要地址,您有正确的主意。 只需在用户表中添加一列,指向其在地址表中的主地址,就应该如此。 如果采用多对多方法,则可以在数据透视表中添加另一个字段,以将地址标记为用户的主要地址。
回复:更新2。
进行更改后,获得用户的主要地址应该非常容易。 您有几种选择。 如果您要遍历用户的地址,则可以简单地将$user->primary_address_id
(或者在您的情况下为address_id
)字段与$address->id
:
@foreach ($user->addresses as $address)
@if ($address->id == $user->primary_address_id)
<p>Do something with your primary address</p>
@endif
<p>
{{ $address->address }}<br>
{{ $address->city }}, {{ $address->province }}<br>
{{ $address->country }}<br>
{{ $address->postalcode }}
</p>
@endforeach
我建议向您的User
模型添加一个方法来帮助您。 这样的事情可以解决问题:
class User extends Model
{
// ..
public function isPrimaryAddress(Address $address)
{
return $this->primary_address_id == $address->id;
}
}
这样,您可以使用@if ($user->isPrimaryAddress($address))
上面模板代码中的if ($address->id == $user->primary_address_id)
@if ($user->isPrimaryAddress($address))
。 这有助于使代码更具可读性。
现在,如果您愿意,还可以向用户模型添加另一个关系以获得用户的主要地址:
class User extends Model
{
// ..
public function primaryAddress()
{
return $this->hasOne(Address::class, 'id', 'primary_address_id');
}
}
然后,如果要获取用户的主地址,则只需执行以下操作:
$primaryAddress = $user->primary_address;
在将address_id
添加到我的用户表并获取地址id作为主要地址之后,这里是我获取所有用户地址并与其他人分开主要地址的方法。
@foreach($user->addresses as $index => $address)
<tr>
<td class="text-center">{{$index+1}}</td>
<td class="text-center">{{$address->address}}</td>
<td class="text-center">{{$address->city}}</td>
<td class="text-center">{{$address->province}}</td>
<td class="text-center">{{$address->country}}</td>
<td class="text-center">{{$address->postalcode}}</td>
<td class="text-center">
<div class="funkyradio">
@if($user->address_id == $address->id)
<div class="funkyradio-success">
<input type="checkbox" name="checkbox" id="yes" checked/>
<label for="yes">Yes</label>
</div>
@else
<div class="funkyradio-default">
<input type="checkbox" name="checkbox" id="no"/>
<label for="no">NO</label>
</div>
@endif
@endforeach
感谢Jonathon和Nemoden对他们的帮助(投票)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.