繁体   English   中英

用户解决Laravel中的逻辑

[英]Users address logic in laravel

我的laravel应用程序usersaddresses有2个表,并且两个表都在运行中,我想做的是:

  1. 为每个用户设置多个地址(完成)
  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列,我可以将其设置为01以获得用户的主要地址,

现在我在用户编辑页面中,我有2个地址属于ID为1用户,现在我想将选定的主地址更改为另一个地址,但是我在用户配置文件中编辑如何在表单路由时更新地址表is_primary列是users.update而不是addresses_update

更新2

我做了一些更改,这里是:

  1. 用户表具有address_id
  2. 地址表不再具有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_primaryis_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

感谢JonathonNemoden对他们的帮助(投票)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM