与数据table中相同table中的多个外键的关系与Laravel、Eloquent

Relationship with multiple foreign key in same table in datatable with Laravel, Eloquent

我现在使用 Laravel 8、Eloquent 和 Datatables 几天了。我实际上找到了如何用我的 table 之一显示数据 table 和数据 table 和 Eloquent.

我现在的问题是我需要在一列中显示名称(您可以在“名称”table 中找到)而不是他的外键。

screenshot of the actual result of my datatables

这是我实际拥有的屏幕截图,我的目的是显示您可以在“称谓”中找到的“abrege”table 在我以红色显示的第 2 列中(“ App CVI”和“App engage”),而不是它们的外键。

我的代码实际上是:

我的“SousParcelle”模特:

class SousParcelle extends Model
{
    use HasFactory;
    protected $table = 'sous_parcelles';
    protected $fillable = ['id',
        'parcelle_id',
        'cepage_id',
        'appellation_cvi_id',
        'dist_entre_rang',
        'dist_sur_rang',
        'densite_theorique',
        'superficie',
        'annee_plantation',
        'modification_par',
        'modification_le',
        'validee',
        'affectation_appellation_id',
        'affectation_superficie'];

    public function appellation(){
        return $this->belongsTo(Appellation::class, 'affectation_appellation_id', 'id');
    }
}

我的“称谓”模型:

class Appellation extends Model
{
    use HasFactory;
    protected $table = 'appellations';
    protected $fillable = ['id', 'libelle', 'abrege', 'siqo_id'];

    public function sousparcelles(){
        return $this->hasMany(Appellation::class, 'affectation_appellation_id', 'id');
    }
}

我的“SousParcellesController”数据table 控制器:

class SousParcellesController
{
    public function index()
    {
        return view('welcome');
    }

    public function getSousParcelles(Request $request)
    {
        if ($request->ajax()) {
            $query = SousParcelle::with(['appellation' => function($query){
                $query->select('abrege');
            }]);

            return DataTables::of($query)
            ->addIndexColumn()
            ->addColumn('App engagee', function(SousParcelle $sousparcelles){
                return $sousparcelles->appellations()->abrege;
            })
            ->make(true);
        }
    }
}

我认为脚本“welcome.blade.php”:


        <table id="sousparcelles" class="table table-bordered yajra-datatable">
            <thead>
            <tr>
                <th>Référence Cadastrale</th>
                <th>Commune</th>
                <th>Plantation</th>
                <th>Cepage</th>
                <th>App CVI</th>
                <th>Sup CVI</th>
                <th>App engagee</th>
                <th>Sup engagee</th>
            </tr>
            </thead>
            <tbody>
            </tbody>
        </table>


 <script type="text/javascript">
            function load_table(appellation_id) {

                if ($.fn.dataTable.isDataTable('.yajra-datatable')) {
                    $('.yajra-datatable').DataTable().destroy();
                }

                var table = $('.yajra-datatable').DataTable({
                    processing: true,
                    serverSide: true,
                    searching: true,

                    ajax: "{{ route('sousparcelles.liste') }}",
                    columns: [
                        {data: 'dist_entre_rang', name: 'dist_entre_rang'},
                        {data: 'parcelle_id', name: 'parcelle_id'},
                        {data: 'annee_plantation', name: 'annee_plantation'},
                        {data: 'cepage_id', name: 'cepage_id'},
                        {data: 'appellation_cvi_id', name: 'appellation_cvi_id', type: 'selection'},
                        {data: 'superficie', name: 'superficie'},
                        {data: 'affectation_appellation_id', name: 'appellations.abrege'},
                        {data: 'affectation_superficie', name: 'affectation_superficie'},
                    ]
                });
            }
            $(function () {
                load_table(5);
            });

            function change_appellation() {
                load_table(6);
            }
</script>

请问有人能给我讲讲这段关系的交流吗?

更新!我找到了解决方案!我决定更改整个请求,现在它运行良好。这是我的解决方案:

我的控制器的更改部分(更多 'join' 用于其他表和 'where' 仅具有连接帐户的条目):


    public function getSousParcelles(Request $request)
    {
        if ($request->ajax()) {
            $id = Auth::id();
            $userData = DB::table('sous_parcelles')
                ->join('appellations as affectation', 'affectation.id', '=', 'sous_parcelles.affectation_appellation_id')
                ->join('appellations as engagee', 'engagee.id', '=', 'sous_parcelles.appellation_cvi_id')
                ->join('parcelles', 'parcelles.id', '=', 'sous_parcelles.parcelle_id')
                ->join('users', 'users.id', '=', 'parcelles.user_id')
                ->select('sous_parcelles.*', 'affectation.abrege as affectationlib', 'engagee.abrege as engageelib', 'parcelles.campagne as parcellescamp')->where('user_id', '=', $id);

            return Datatables::of($userData)->filter(function ($query) use ($request) {
            })->make(true);
        }

这是我的新 JS 脚本:


var table = $('.yajra-datatable').DataTable({
                    processing: true,
                    serverSide: true,
                    searching: false,

                    ajax: "{{ route('sousparcelles.liste') }}",
                    columns: [
                        {data: 'parcellescamp', name: 'parcelles.campagne'},
                        {data: 'parcelle_id', name: 'sous_parcelles.parcelle_id'},
                        {data: 'annee_plantation', name: 'sous_parcelles.annee_plantation'},
                        {data: 'cepage_id', name: 'sous_parcelles.cepage_id'},
                        {data: 'affectationlib', name: 'affectation.abrege'},
                        {data: 'superficie', name: 'sous_parcelles.superficie'},
                        {data: 'engageelib', name: 'engagee.abrege'},
                        {data: 'affectation_superficie', name: 'sous_parcelles.affectation_superficie'},
                    ]
                });

所有其他文件不会因为这个问题而改变。

希望对大家有用。