我对Laravel非常陌生。您可以通过一个小问题帮助我: 我无法返回集合,只能返回模型中定义的关系中特定列的值。我会解释:
我有2张桌子:
1-Tomos
2-文档
迁移:
1- Tomos
private $table = 'tomos';
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create($this->table, function (Blueprint $table) {
$table->increments('id');
$table->string('name')->nullable(false);
$table->text('description')->nullable(true);
$table->boolean('active')->default(true);
$table->timestamps();
});
}
2-文档
private $table = 'documents';
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create($this->table, function (Blueprint $table) {
$table->increments('id');
$table->date('date')->nullable(false);
$table->integer('provider_id');
$table->integer('tomo_id');
$table->string('folio')->nullable(false);
$table->integer('user_id');
$table->text('description');
$table->timestamps();
$table->foreign('provider_id')
->references('id')->on('providers');
$table->foreign('tomo_id')
->references('id')->on('tomos');
$table->foreign('user_id')
->references('id')->on('users');
});
}
关系
1- Tomo
public function document()
{
return $this->hasMany(Document::class);
}
2-文档
public function tomo()
{
return $this->belongsTo(Tomo::class);
}
控制器
class Documents extends Controller
{
public function read(Request $request)
{
$provider = $request->only('id');
$documents = Document::select(['id', 'date', 'tomo_id', 'description'])
->with([
'tomo' => function ($query) {
$query->select('id', 'name');
}
])->orderBy('date', 'ASC')
->paginate(25);
return $documents;
}
}
我在JSON中收到以下响应:
current_page 1
data […]
0 {…}
id 2
date 2018-12-01
tomo_id 1
description 1
tomo {…}
id 1
name Tomo 1
但是...我不希望键('tomo')返回对象,我希望它以字符串的形式返回列('name')的值。示例:
current_page 1
data […]
0 {…}
id 2
date 2018-12-01
tomo_id 1
description 1
tomo Tomo 1
非常感谢您。
答案 0 :(得分:0)
首先,您需要添加protected $appends = array('tomo_name');
作为属性,因为这是模型表上不存在的属性。
public function getTomoNameAttribute()
{
return $this->tomo()->name;
}
此后,您可以访问->tomo_name
这样的tomo名称
我不是100%地确定此代码仅适用于复制粘贴,但是您可能会有所了解并进行更多处理。
哦,请注意,加载属性会每次在数据库中查询该“ tomo”。
答案 1 :(得分:0)
非常感谢您: Peter 和 Munteanu Petrisor
特别提示: Munteanu Petrisor
我能够使用您向我提出的解决方案解决问题,以前我已经使用'join'实现了该解决方案:
class Documents extends Controller
{
public function read(Request $request)
{
$provider = $request->only('id');
$documents = Document::join('tomos', 'documents.tomo_id', '=', 'tomos.id')
->join('users', 'documents.user_id', '=', 'users.id')
->where(['provider_id' => $provider])
->paginate(25, array(
'documents.id',
'documents.date',
'documents.folio',
'documents.description',
'tomos.name as tomo',
));
return $documents;
}
}
现在,在您的帮助下,使用属性会产生奇迹:
文档模型
protected $appends = [
'tomo_name',
'user_fullname'
];
public function getTomoNameAttribute()
{
return $this->tomo()->first()->name;
}
public function getUserFullNameAttribute()
{
return $this->user()->first()->first_name . ' ' . $this->user()->first()->last_name;
}
文档控制器
class Documents extends Controller
{
public function read(Request $request)
{
$provider = $request->only('id');
$documents = Document::select(['id', 'date', 'tomo_id', 'user_id', 'folio', 'description'])
->where(['provider_id' => $provider])
->orderBy('date', 'ASC')
->paginate(25);
return $documents;
}
}
现在它以我期望的方式返回数据
data […]
0 {…}
id 2
date 2018-12-01
tomo_id 1
user_id 1
folio 1
description 1
tomo_name 1
user_fullname First Last
非常感谢您!
答案 2 :(得分:-1)
在您的控制器中,尝试:
$documents->getCollection()->transform(function ($item) {
$item->tomo = $item->tomo->name;
return $item;
});
return $documents;