如何用逗号分隔的 id 模拟 Eloquent 关系

     2023-03-14     216

关键词:

【中文标题】如何用逗号分隔的 id 模拟 Eloquent 关系【英文标题】:How to mimic Eloquent relationship with comma separated ids 【发布时间】:2015-03-10 00:57:48 【问题描述】:

我有两个表,订单和层。在我的订单表中,我将一个数组保存在 layer_id 中,我已将其设置为 varchar。我先把它炸开,然后显示记录。我想做的是显示图层表中的记录,例如来自 layer_name 列的名称。我也设置了他们的关系。如有任何建议,我将不胜感激。

我的控制器:

public function getCheckout()
    $orders = Order::get();
    return View::make('checkout')->with('orders', $orders);

我的看法:

@forelse($orders as $order)

<div class="panel panel-default">
    <div class="panel-heading">
        <h3 class="panel-title"> $order->style_id </h3>
    </div>
    <div class="panel-body">
    <p>Layers you chose</p>

    <table class="table">
        <tr>
        <td>ID</td>
        @foreach(explode(',', $order->layer_id) as $layer) 
            <td> $layer </td>
        @endforeach
        </tr>

    </table>
</div>
    <div class="panel-footer"><button class="btn btn-primary">Confirm</button></div>
</div>

@empty

<p>Nothing to display</p>

@endforelse

我的模特

Class Order extends Eloquent 
    public function layer() 
        return $this->belongsTo('Layer', 'layer_id');
    

【问题讨论】:

【参考方案1】:

我的第一个建议是标准化您的数据库。在 Eloquent ORM 的上下文中,您不能为此使用内置关系。

不过,出于好奇,您应该这样做:

通过以下设置,您可以:

// 1. Use layers like eloquent dynamic property
$order->layers; // collection of Layer models

// 2. Call the query to fetch layers only once
$order->layers; // query and set 'relation'
// ... more code
$order->layers; // no query, accessing relation

// 3. Further query layers like you would with relationship as method:
$order->layers()->where(..)->orderBy(..)->...->get();

// 4. Associate layers manually providing either array or string:
$order->layer_ids = '1,5,15';
$order->layer_ids = [1,5,15];

但你不能:

// 1. Eager/Lazy load the layers for multiple orders
$orders = Order::with('layers')->get(); // WON'T WORK

// 2. Use any of the relationship methods for associating/saving/attaching etc.
$order->layers()->associate(..); // WON'T WORK

但您可以这样做(我建议将 layer_id 重命名为 layer_ids 以便不言自明,我的示例涵盖了该更改):

/**
 * Accessor that mimics Eloquent dynamic property.
 *
 * @return \Illuminate\Database\Eloquent\Collection
 */
public function getLayersAttribute()

    if (!$this->relationLoaded('layers')) 
        $layers = Layer::whereIn('id', $this->layer_ids)->get();

        $this->setRelation('layers', $layers);
    

    return $this->getRelation('layers');


/**
 * Access layers relation query.
 *
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function layers()

    return Layer::whereIn('id', $this->layer_ids);


/**
 * Accessor for layer_ids property.
 *
 * @return array
 */
public function getLayerIdsAttribute($commaSeparatedIds)

    return explode(',', $commaSeparatedIds);


/**
 * Mutator for layer_ids property.
 *
 * @param  array|string $ids
 * @return void
 */
public function setLayersIdsAttribute($ids)

    $this->attributes['layers_ids'] = is_string($ids) ? $ids : implode(',', $ids);


edit:当然,您可以在您的视图中简单地执行此操作。它符合您当前的代码,但显然与我的建议相去甚远;)

@foreach (Layer::whereIn('id', explode(',', $order->layer_id))->get() as $layer)
   $layer->whatever 

【讨论】:

我有同样的情况,在刀片中使用更容易,非常感谢【参考方案2】:

我创建了一个包,允许您使用 JSON 数组定义多对多关系:https://github.com/staudenmeir/eloquent-json-relations

你可以这样使用它:

class Order extends Model 
    use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships;

    protected $casts = [
        'layer_id' => 'json',
    ];

    public function layers() 
        return $this->belongsToJson(Layer::class, 'layer_id');
    


class Layer extends Model 
    use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships;

    public function orders() 
        return $this->hasManyJson(Order::class, 'layer_id');
    

【讨论】:

如何用字符串分隔的逗号填充 C# 列表框

】如何用字符串分隔的逗号填充C#列表框【英文标题】:HowtopopulatedC#listboxwithstringseparatedcomma【发布时间】:2020-10-1911:35:09【问题描述】:我有一个用逗号分隔的字符串,如下所示:"test1,test2,test3"我想用以下代码将这些字符串转... 查看详情

你如何用 awk 解析逗号分隔值(csv)?

】你如何用awk解析逗号分隔值(csv)?【英文标题】:howdoyouparsecomma-separated-values(csv)withawk?【发布时间】:2010-11-2913:31:48【问题描述】:我正在尝试编写一个awk脚本来将CSV格式的电子表格转换为XML以解决Bugzilla错误。输入CSV的格... 查看详情

如何用逗号分割行并在 PostgreSQL 中取消透视表?

】如何用逗号分割行并在PostgreSQL中取消透视表?【英文标题】:HowtosplittherowbyacommaandunpivotthetableinPostgreSQL?【发布时间】:2022-01-2320:58:30【问题描述】:我有这张表,我想用逗号分隔列并取消透视它我的桌子+------------+--------------... 查看详情

如何用java解析csv文件

首先看一下csv文件的规则:csv(CommaSeparateValues)文件即逗号分隔符文件,它是一种文本文件,可以直接以文本打开,以逗号分隔。windows默认用excel打开。它的格式包括以下几点(它的格式最好就看excel是如何解析的。):①每条... 查看详情

两个外键,如何用 laravel eloquent 映射

】两个外键,如何用laraveleloquent映射【英文标题】:twoforeignkeys,howtomapwithlaraveleloquent【发布时间】:2014-09-2313:30:12【问题描述】:我在MySQL中有两个表,其中第一个称为users,第二个称为games。表结构如下。用户id(主要)电子邮... 查看详情

如何用引号和逗号连接多列单元格数据

】如何用引号和逗号连接多列单元格数据【英文标题】:howtoconcatenatemulticolumncelldatawithquotationsandcommas【发布时间】:2022-01-1618:27:18【问题描述】:我有50列数据,从“G”到“BD”,记录数据按行组织。有些单元格有数据,有些则... 查看详情

如何用逗号和空格java分割表达式

...:[some,blabla,sentence,example]我可以用逗号分隔,但不知道如何用逗号和空格分割?我的源代码,到目前为止:string.split("s*,s*")答案您可以使用一组字符作为分隔符,如Pattern中所述Stringstring="Onestepat,,a,time,.";System. 查看详情

如何用 Eloquent 建立多态关系

】如何用Eloquent建立多态关系【英文标题】:HowtoestablishpolymorphicrelationswithEloquent【发布时间】:2020-07-2423:21:00【问题描述】:使用Laravel和Eloquent。我有一个如下所示的数据库:dance_performers.dance_perfomer_type字段包含\'\\App\\Dancer\'、\... 查看详情

PySpark:如何用逗号指定列作为十进制

】PySpark:如何用逗号指定列作为十进制【英文标题】:PySpark:Howtospecifycolumnwithcommaasdecimal【发布时间】:2018-10-0812:43:48【问题描述】:我正在使用PySpark并加载一个csv文件。我有一列包含欧洲格式的数字,这意味着逗号替换了点... 查看详情

查询逗号分隔的 ID 到逗号分隔的值

】查询逗号分隔的ID到逗号分隔的值【英文标题】:Queryforcomma-separatedidstocomma-separatedvalues【发布时间】:2013-01-3019:47:04【问题描述】:我有两张桌子部门IDDept---------1HR2Accts3IT员工IDNameDepts-------------------1Kevin2,12Michelle13Troy1,34Rheesa2,... 查看详情

python如何用print打印出列表

直接使用print函数就可以了,举个例子:L=['apple','fruit']#定义一个列表print(L)#输出一个列表输出结果就是['apple','fruit']。扩展资料:不带输出项的print即为输出一个空行,如果之前的print语句输出项的最后... 查看详情

C++ 用选定的逗号分隔字符串

...我正在阅读以下问题Parsingacomma-delimitedstd::string,关于如何用逗号分割字符串(有人给了我上一个问题的链接),其中一个答案是:stringstreamss("1,1,1,1,orsomethingelse,1,1,1,0");vec 查看详情

如何通过逗号分隔将 2 行合并为一行?

...题描述】:我需要将这些单独的行合并到一列,我现在如何用逗号分隔合并列,+---------------+-------+-------+|CID|Flag|Value|+---------------+-------+-------+|1|F|10||1|N| 查看详情

在shell脚本中获取逗号分隔值

】在shell脚本中获取逗号分隔值【英文标题】:Getcommaseparatedvaluesinshellscript【发布时间】:2018-11-0921:49:28【问题描述】:我有一个包含多行的文件,如以下字符串。我需要提取id和obj的值。"Class":"ZONE","id":"DEV100.ZN301","name":"3109EBTM",... 查看详情

如何用点替换逗号

】如何用点替换逗号【英文标题】:howtoreplacecommawithdot【发布时间】:2016-09-0507:25:23【问题描述】:我的json中有逗号值,我希望当我得到这些值时,我将它们放在点中,所以基本上我想将我的逗号值转换为点值..我的json看起来... 查看详情

如何用 eloquent 在 Laravel 中只获取一个用户数据?

】如何用eloquent在Laravel中只获取一个用户数据?【英文标题】:HowtogetjustoneuserdatainLaravelwitheloquent?【发布时间】:2021-08-1301:04:24【问题描述】:我使用Laravel8。我想获取用户进程课程,但我得到了所有用户进程。在User.php中publicfu... 查看详情

如何用线条路径绘制CALayer,如模拟橡皮擦效果?

】如何用线条路径绘制CALayer,如模拟橡皮擦效果?【英文标题】:howtodrawCALayerwithlinepathlikesimulateerasereffect?【发布时间】:2014-06-0214:56:35【问题描述】:我想通过触摸事件来模拟橡皮擦效果,以显示在顶部有东西遮挡的图像,例... 查看详情

Instagram API 通过逗号分隔的 ID 获取批量对象

】InstagramAPI通过逗号分隔的ID获取批量对象【英文标题】:InstagramAPIgetbulkobjectsbycommaseparatedIDs【发布时间】:2016-02-1415:01:50【问题描述】:我有一个简单的应用程序,其中有大量Instagram对象ID。我正在寻找一个API,我可以从中将id... 查看详情