如何使用Laravel Eloquent获取相关城市的国家名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Laravel Eloquent获取相关城市的国家名称相关的知识,希望对你有一定的参考价值。

我在我的项目中需要帮助,我有一个城市组件,通过id如何在城市表和国家表之间建立关系,如何获取城市组件中每个城市的国家名称

这是我在城市组件中的代码

<table id="example" class="display" style="width:100%">
            <thead>
            <tr>
                <th>
                    <label class="form-checkbox">
                        <input type="checkbox" v-model="selectAll" @click="select">
                        <i class="form-icon"></i>
                    </label>
                </th>
                <th>#</th>
                <th>City Name</th>
                <th>Country Name</th>
                <th>Created At</th>
                <th>Updated At</th>
                <th>Edit</th>
                <th>Delete</th>

            </tr>
            </thead>
            <tbody>
            <tr v-if="cities.length > 0" v-for="(city,index) in cities" :id="city.id">
                <td>
                    <label class="form-checkbox">
                        <input type="checkbox" :value="city.id" v-model="selected">
                        <i class="form-icon"></i>
                    </label>
                </td>
                <td>index+1 </td>
                <td>city.name</td>
                <td></td>
                <td>city.created_at</td>
                <td>city.updated_at</td>
                <td><button class="btn btn-warning" @click="editModal=true;setVal(city.id,city.name,city.country)" data-toggle="modal" data-target="#editcity"><i class="fa fa-pen"></i></button></td>
                <td><button class="btn btn-danger" @click="delcity(city.id)"><i class="fa fa-trash"></i></button></td>


            </tr>
            </tbody>
            <tfoot>
            <tr>
                <th><label class="form-checkbox">
                    <input type="checkbox" v-model="selectAll" @click="select">
                    <i class="form-icon"></i>
                </label></th>
                <th>#</th>
                <th>City Name</th>
                <th>Country Name</th>
                <th>Created At</th>
                <th>Updated At</th>
                <th>Edit</th>
                <th>Delete</th>

            </tr>
            </tfoot>
        </table>

城市部分代码的第二部分

<script>
export default 
    data()
        return 
            cities:         [],
            countries:      [],
            id:             '',
            name:           '',
            country_id:     '',
            country_name:   '',
            loading:        false,
            showModal:      false,
            editModal:      false,
            selected:       [],
            selectAll:      false,
            csrf:           document.querySelector('meta[name="csrf-token"]').getAttribute('content')
        
    ,
    methods:
        getCities()
            let url = '/dashboard/getCities';
            axios.get(url).then(res=>
                let link = this;
                this.cities = res.data;
                /*this.cities.forEach(function(item) 
                    link.getCountryName(item.country_id);
                );*/
            )
        ,
        getCountryName(id)
            axios.get('/dashboard/getCountryName/'+id).then(res=>
                console.log(res.data.success);
                this.country_name = res.data.success;
            );
        ,
        getCountries()
            axios.get('/dashboard/getCountries').then(res=>
                this.countries = res.data;
            )
        ,

     ,

    mounted() 
        this.getCities();
        this.getCountries();
    

这两个函数获取城市并在城市控制器中获取国家/地区名称

public function getCities()
    $cities = City::orderBy('id','desc')->get();
    return response()->json($cities);

public function getCountryName($country_id)
    $country = DB::table('countries')->where('id','=',$country_id)->first();
    return response()->json(['success'=> $country->name],200);

国家模型中的关系代码

public function cities()
    return $this->hasMany('App\Models\City');

城市模型中的关系代码

public function countries()
        return $this->hasMany('App\Models\City');
    
答案
我认为您过于复杂了,这应该非常简单。如果您的Eloquent relationships设置正确,则在相关Country模型的序列化中包含City模型的字段相对来说并不容易。

您的关系应如下所示:

City.php

<?php ... class City extends Model ... public function Country return $this->belongsTo('App\Models\Country');

Country.php

<?php ... class Country extends Model ... public function Cities return $this->hasMany('App\Models\City');

NOTE:

此设置需要country_id表上的cities
您目前已将此关系定义为many-to-many,考虑到上下文,这没有多大意义。 City没有很多国家。 <<< [belongsTo确切地为[[

one国家。另一面很好,因为Country does有许多城市。因此,您想要的是one-to-many关系。一旦正确设置了模型关系,就可以轻松获取任何CountryCity名称。我会这样:

City.php<?php ... class City extends Model ... protected $with = ['country'];

这意味着,每当从数据库中加载City时,其相关的Country就是eager loaded

或者,当您加载所有城市时,您可以渴望加载相关的Country

citycontroller

public function getCities() $cities = City::with('country') ->orderBy('id','desc') ->get(); return response()->json($cities);

无论选择哪种实现,您的城市组件都可以通过Country模型访问City的字段:

<tr v-if="cities.length > 0" v-for="(city,index) in cities" :id="city.id"> ... <td> city.country.name </td> ... </tr>

另一答案
to

public function country() // return $this->belongsTo('App\Models\Country'); return $this->belongsTo(Country::class);

通过将countries重命名为country的方式

以上是关于如何使用Laravel Eloquent获取相关城市的国家名称的主要内容,如果未能解决你的问题,请参考以下文章

Laravel eloquent 获取相关表的最新行

使用 Eloquent 在 Laravel 中使用 where 子句访问嵌套的相关对象

Laravel Eloquent在相关模型上按范围获取模型

Laravel Eloquent:如何排序相关模型的结果?

急切加载 Laravel Eloquent 相关模型

如何使用 Laravel eloquent 根据经纬度从 mongodb 获取位置?