Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获取用户提供的地区的国家、地区、城镇和地区名称\u id迁移到用户表_Sql_Laravel_Laravel 5_Relationship - Fatal编程技术网

Sql 如何获取用户提供的地区的国家、地区、城镇和地区名称\u id迁移到用户表

Sql 如何获取用户提供的地区的国家、地区、城镇和地区名称\u id迁移到用户表,sql,laravel,laravel-5,relationship,Sql,Laravel,Laravel 5,Relationship,我想使用area_id获取一个地区、一个城镇、一个地区和一个国家的名称,该id将迁移到属于特定用户的用户表中 我有5张桌子,包括 具有id、名称和说明的国家/地区表 具有id、名称、说明和国家/地区id的区域表 具有id、名称、描述和区域id的Town表 带有id、名称、说明和城镇id的面积表 我有一个用户表,其中area_id的值迁移到用户表,并具有id、name、姓氏、email、phone、area_id等属性 我想知道,如果area_id存在于使用Laravel的数据库的用户表中,如何获

我想使用area_id获取一个地区、一个城镇、一个地区和一个国家的名称,该id将迁移到属于特定用户的用户表中

我有5张桌子,包括

具有id、名称和说明的国家/地区表

具有id、名称、说明和国家/地区id的区域表

具有id、名称、描述和区域id的Town表

带有id、名称、说明和城镇id的面积表

我有一个用户表,其中area_id的值迁移到用户表,并具有id、name、姓氏、email、phone、area_id等属性

我想知道,如果area_id存在于使用Laravel的数据库的用户表中,如何获取特定用户的地区、城镇、地区和国家的名称

在我的用户控制器中,我做了如下操作

 /**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */

public function accueil(Session $session)
{
    $recentJobbers =User::with('Area')
        ->limit(5)
         ->whereType('jobber')
        ->orderBy('updated_at', 'desc')
        ->get();

    return view('home', compact('recentJobbers','areas', 'categories'));
}
  public function category() 
{
    return $this->belongsTo('App\Category');
}

public function service() 
{
    return $this->belongsTo('App\Service');
}

 public function region() 
{
    return $this->belongsTo('App\Region');
}

public function town() 
{
    return $this->belongsTo('App\Town');
}

 public function area() 
{
    return $this->belongsTo('App\Area');
}
在我的刀锋观中,我做到了这一点

 <div class="col-lg-12">
                    <div class="heading">
                        <h2>Jobbeurs en vedette</h2>
                        <span>Principaux jobbers ayant déjà  été solicités pour leur travail.</span>
                    </div><!-- Heading -->
                    <div class="job-listings-sec">

                        @foreach($recentJobbers as $recentJobber)
                        <div class="job-listing">
                            <div class="job-title-sec">
                                <div class="c-logo"> <img src="{{url('images/avatars/'. $recentJobber->photo) }}" alt="Image" /> </div>
                                <h3><a href="{{ route('profileDetails', ['id'=>$recentJobber->id]) }}" title="">{{ $recentJobber->name }} {{ $recentJobber->surname }} <span style="float:right; padding-left: 10px;">(a ete contacte 25 fois)</span></a></h3>
                                <span>{{ $recentJobber->title }}</span>
                            </div>
                            <span class="job-lctn"><i class="la la-map-marker"></i>{{ $recentJobber->area->name }}, {{ $recentJobber->town->name }}, {{ $recentJobber->region->name }}</span>
                            <span class="fav-job"><i class="la la-heart-o"></i></span>
                            <a href="{{ route('profileDetails', ['id'=>$recentJobber->id]) }}" class="job-is ft">Voir Profil</a>
                        </div><!-- Job -->
                        @endforeach
                    </div>
                </div>
但它只返回区域名称。不返回城镇、地区或国家名称


我想知道实现这一目标最简单的方法是什么。欢迎提供任何帮助

您所能做的是在每个模型上建立关系-而不是在
用户上建立所有关系

class Region extends Model
{
    protected $fillable = ['country_id', 'name', 'description'];

    public function country(): BelongsTo
    {
        return $this->belongsTo(Country::class);
    }
}

class Town extends Model
{
    protected $fillable = ['region_id', 'name', 'description'];

    public function region(): BelongsTo
    {
        return $this->belongsTo(Region::class);
    }
}

class Area extends Model
{
    protected $fillable = ['town_id', 'name', 'description'];

    public function town(): BelongsTo
    {
        return $this->belongsTo(Town::class);
    }
}

class User extends Authenticatable
{
    // ...

    public function area(): BelongsTo
    {
        return $this->belongsTo(Area::class);
    }
}
然后,要获得所有这些关系,您可以像这样使用“急切加载”:

$recentJobbers = User::with('area.town.region.country')
        ->limit(5)
        ->whereType('jobber')
        ->orderBy('updated_at', 'desc')
        ->get();
现在,您可以通过以下方式在每条记录上访问这些内容:

$recentJobber->area->town->region->country->name;
$recentJobber->area->town->region->name;
$recentJobber->area->town->name;
$recentJobber->area->name;
确保使用如上所示的即时加载-否则在每次迭代中获取这些关系将非常昂贵。以下是有关该主题的一些附加信息:

为了使它看起来更美观,您可以向
用户
模型添加访问器

class User extends Authenticatable
{
    // ...

    public function area(): BelongsTo
    {
        return $this->belongsTo(Area::class);
    }

    public function getTownAttribute(): Town
    {
        return $this->area->town;
    }

    public function getRegionAttribute(): Region
    {
        return $this->area->town->region;
    }

    public function getCountryAttribute(): Country
    {
        return $this->area->town->region->country;
    }
}
然后像在视图示例中那样调用它

$recentJobber->country->name;
$recentJobber->region->name;
$recentJobber->town->name;
$recentJobber->area->name;
这里有一个测试来支持上述内容

 /**
 * @test
 */
public function pulls_area_town_region_and_country()
{
    $country = Country::create([
        'name' => 'United Kingdom',
        'description' => 'United Kingdom'
    ]);

    $region = Region::create([
        'country_id' => $country->id,
        'name' => 'Somerset',
        'description' => 'Somerset'
    ]);

    $town = Town::create([
        'region_id' => $region->id,
        'name' => 'Bristol',
        'description' => 'Bristol'
    ]);

    $area = Area::create([
        'town_id' => $town->id,
        'name' => 'South',
        'description' => 'South'
    ]);

    factory(User::class)->create([
        'area_id' => $area->id
    ]);


    $user = User::with('area.town.region.country')->first();

    $this->assertEquals('United Kingdom', $user->area->town->region->country->name);
    $this->assertEquals('Somerset', $user->area->town->region->name);
    $this->assertEquals('Bristol', $user->area->town->name);
    $this->assertEquals('South', $user->area->name);

    $this->assertEquals('United Kingdom', $user->country->name);
    $this->assertEquals('Somerset', $user->region->name);
    $this->assertEquals('Bristol', $user->town->name);
    $this->assertEquals('South', $user->area->name);
}

非常感谢,先生。这段代码非常好,简单,解释得很好,正是我想要的。我不知道该为此感谢你多少。你真的节省了我的时间。最后一件事,这个区域是什么():这段代码中的角色是什么?不客气-很高兴我能帮上忙。它是返回类型声明-它基本上指示了方法返回的内容-在这种情况下,它将是\illumb\Database\Eloquent\Relations\BelongsTo的实例-因此请确保在每个模型类定义的顶部导入这些类使用illumb\Database\Eloquent\Relations\BelongsTo-或者您可以删除它。这里是这个功能的链接,非常感谢,我已经添加了它,它工作得非常完美。抱歉打扰了,但我还有一个问题很类似。你能检查一下吗?刚刚发布了另一个问题的答案。