与数据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'},
]
});
所有其他文件不会因为这个问题而改变。
希望对大家有用。
我现在使用 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'},
]
});
所有其他文件不会因为这个问题而改变。
希望对大家有用。